diff options
873 files changed, 18871 insertions, 6038 deletions
diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb index 6b3278fc6925..4f5b62060856 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "8572644" + build_id: "9653376" target: "CtsShim" source_file: "aosp_arm64/CtsShimPriv.apk" } @@ -8,7 +8,7 @@ drops { version: "" version_group: "" git_project: "platform/frameworks/base" - git_branch: "tm-dev" + git_branch: "master" transform: TRANSFORM_NONE transform_options { } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb index 34c9c4d4fe08..404bcacde167 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "8572644" + build_id: "9653376" target: "CtsShim" source_file: "aosp_arm64/CtsShim.apk" } @@ -8,7 +8,7 @@ drops { version: "" version_group: "" git_project: "platform/frameworks/base" - git_branch: "tm-dev" + git_branch: "master" transform: TRANSFORM_NONE transform_options { } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShimPriv_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShimPriv_apk.asciipb new file mode 100644 index 000000000000..e89809138548 --- /dev/null +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShimPriv_apk.asciipb @@ -0,0 +1,15 @@ +drops { + android_build_drop { + build_id: "9653376" + target: "CtsShim" + source_file: "aosp_riscv64/CtsShimPriv.apk" + } + dest_file: "packages/CtsShim/apk//riscv64/CtsShimPriv.apk" + version: "" + version_group: "" + git_project: "platform/frameworks/base" + git_branch: "master" + transform: TRANSFORM_NONE + transform_options { + } +} diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShim_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShim_apk.asciipb new file mode 100644 index 000000000000..04092366c257 --- /dev/null +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__riscv64_CtsShim_apk.asciipb @@ -0,0 +1,15 @@ +drops { + android_build_drop { + build_id: "9653376" + target: "CtsShim" + source_file: "aosp_riscv64/CtsShim.apk" + } + dest_file: "packages/CtsShim/apk//riscv64/CtsShim.apk" + version: "" + version_group: "" + git_project: "platform/frameworks/base" + git_branch: "master" + transform: TRANSFORM_NONE + transform_options { + } +} diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb index 6897a027705f..045af028a668 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "8572644" + build_id: "9653376" target: "CtsShim" source_file: "aosp_x86_64/CtsShimPriv.apk" } @@ -8,7 +8,7 @@ drops { version: "" version_group: "" git_project: "platform/frameworks/base" - git_branch: "tm-dev" + git_branch: "master" transform: TRANSFORM_NONE transform_options { } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb index 6dfa7810f22d..483b2f1764ae 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "8572644" + build_id: "9653376" target: "CtsShim" source_file: "aosp_x86_64/CtsShim.apk" } @@ -8,7 +8,7 @@ drops { version: "" version_group: "" git_project: "platform/frameworks/base" - git_branch: "tm-dev" + git_branch: "master" transform: TRANSFORM_NONE transform_options { } diff --git a/TEST_MAPPING b/TEST_MAPPING index 81a34796c3ad..1b5795fb2798 100644 --- a/TEST_MAPPING +++ b/TEST_MAPPING @@ -82,14 +82,6 @@ ] }, { - "name": "TestablesTests", - "options": [ - { - "exclude-annotation": "androidx.test.filters.FlakyTest" - } - ] - }, - { "name": "FrameworksCoreTests", "options": [ { diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java index 2f6b6897addb..805dfafe5923 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java @@ -2344,11 +2344,7 @@ public class JobInfo implements Parcelable { // UIDTs if (networkRequest == null) { throw new IllegalArgumentException( - "A user-initaited data transfer job must specify a valid network type"); - } - if (backoffPolicy == BACKOFF_POLICY_LINEAR) { - throw new IllegalArgumentException( - "A user-initiated data transfer job cannot have a linear backoff policy."); + "A user-initiated data transfer job must specify a valid network type"); } } } diff --git a/apex/jobscheduler/framework/java/android/app/job/JobService.java b/apex/jobscheduler/framework/java/android/app/job/JobService.java index 2ab432488df5..f48e07812637 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobService.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobService.java @@ -166,7 +166,8 @@ public abstract class JobService extends Service { * the job in the {@link #onStartJob(JobParameters)} callback. * @param wantsReschedule {@code true} if this job should be rescheduled according * to the back-off criteria specified when it was first scheduled; {@code false} - * otherwise. + * otherwise. When {@code false} is returned for a periodic job, + * the job will be rescheduled according to its periodic policy. */ public final void jobFinished(JobParameters params, boolean wantsReschedule) { mEngine.jobFinished(params, wantsReschedule); @@ -217,7 +218,7 @@ public abstract class JobService extends Service { * {@link android.app.job.JobInfo.Builder#setRequiredNetworkType(int)}, yet while your * job was executing the user toggled WiFi. Another example is if you had specified * {@link android.app.job.JobInfo.Builder#setRequiresDeviceIdle(boolean)}, and the phone left - * its idle maintenance window. There are many other reasons a job can be stopped early besides + * its idle state. There are many other reasons a job can be stopped early besides * constraints no longer being satisfied. {@link JobParameters#getStopReason()} will return the * reason this method was called. You are solely responsible for the behavior of your * application upon receipt of this message; your app will likely start to misbehave if you @@ -241,7 +242,8 @@ public abstract class JobService extends Service { * included. * @return {@code true} to indicate to the JobManager whether you'd like to reschedule * this job based on the retry criteria provided at job creation-time; or {@code false} - * to end the job entirely. Regardless of the value returned, your job must stop executing. + * to end the job entirely (or, for a periodic job, to reschedule it according to its + * requested periodic criteria). Regardless of the value returned, your job must stop executing. */ public abstract boolean onStopJob(JobParameters params); @@ -424,11 +426,14 @@ public abstract class JobService extends Service { * 10 seconds after {@link #onStartJob(JobParameters)} is called, * the system will trigger an ANR and stop this job. * + * The notification must provide an accurate description of the work that the job is doing + * and, if possible, the state of the work. + * * <p> * Note that certain types of jobs - * (e.g. {@link JobInfo.Builder#setDataTransfer data transfer jobs}) may require the - * notification to have certain characteristics and their documentation will state - * any such requirements. + * (e.g. {@link JobInfo.Builder#setEstimatedNetworkBytes(long, long) data transfer jobs}) + * may require the notification to have certain characteristics + * and their documentation will state any such requirements. * * <p> * JobScheduler will not remember this notification after the job has finished running, 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 ea146403546b..d94993d64995 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -482,6 +482,7 @@ public class JobSchedulerService extends com.android.server.SystemService case Constants.KEY_RUNTIME_UI_LIMIT_MS: case Constants.KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_BUFFER_FACTOR: case Constants.KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS: + case Constants.KEY_RUNTIME_CUMULATIVE_UI_LIMIT_MS: case Constants.KEY_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS: if (!runtimeUpdated) { mConstants.updateRuntimeConstantsLocked(); @@ -582,6 +583,8 @@ public class JobSchedulerService extends com.android.server.SystemService "runtime_min_ui_data_transfer_guarantee_buffer_factor"; private static final String KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS = "runtime_min_ui_data_transfer_guarantee_ms"; + private static final String KEY_RUNTIME_CUMULATIVE_UI_LIMIT_MS = + "runtime_cumulative_ui_limit_ms"; private static final String KEY_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS = "runtime_use_data_estimates_for_limits"; @@ -622,6 +625,7 @@ public class JobSchedulerService extends com.android.server.SystemService 1.35f; public static final long DEFAULT_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS = Math.max(10 * MINUTE_IN_MILLIS, DEFAULT_RUNTIME_MIN_UI_GUARANTEE_MS); + public static final long DEFAULT_RUNTIME_CUMULATIVE_UI_LIMIT_MS = 24 * HOUR_IN_MILLIS; public static final boolean DEFAULT_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS = false; static final boolean DEFAULT_PERSIST_IN_SPLIT_FILES = true; static final int DEFAULT_MAX_NUM_PERSISTED_JOB_WORK_ITEMS = 100_000; @@ -760,6 +764,12 @@ public class JobSchedulerService extends com.android.server.SystemService DEFAULT_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS; /** + * The maximum amount of cumulative time we will let a user-initiated job run for + * before downgrading it. + */ + public long RUNTIME_CUMULATIVE_UI_LIMIT_MS = DEFAULT_RUNTIME_CUMULATIVE_UI_LIMIT_MS; + + /** * Whether to use data estimates to determine execution limits for execution limits. */ public boolean RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS = @@ -881,6 +891,7 @@ public class JobSchedulerService extends com.android.server.SystemService KEY_RUNTIME_MIN_UI_GUARANTEE_MS, KEY_RUNTIME_UI_LIMIT_MS, KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS, + KEY_RUNTIME_CUMULATIVE_UI_LIMIT_MS, KEY_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS); // Make sure min runtime for regular jobs is at least 10 minutes. @@ -915,6 +926,11 @@ public class JobSchedulerService extends com.android.server.SystemService properties.getLong( KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS, DEFAULT_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS)); + // The cumulative runtime limit should be at least the max execution limit. + RUNTIME_CUMULATIVE_UI_LIMIT_MS = Math.max(RUNTIME_UI_LIMIT_MS, + properties.getLong( + KEY_RUNTIME_CUMULATIVE_UI_LIMIT_MS, + DEFAULT_RUNTIME_CUMULATIVE_UI_LIMIT_MS)); RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS = properties.getBoolean( KEY_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS, @@ -972,6 +988,7 @@ public class JobSchedulerService extends com.android.server.SystemService RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_BUFFER_FACTOR).println(); pw.print(KEY_RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS, RUNTIME_MIN_UI_DATA_TRANSFER_GUARANTEE_MS).println(); + pw.print(KEY_RUNTIME_CUMULATIVE_UI_LIMIT_MS, RUNTIME_CUMULATIVE_UI_LIMIT_MS).println(); pw.print(KEY_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS, RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS).println(); @@ -2452,11 +2469,16 @@ public class JobSchedulerService extends com.android.server.SystemService JobStatus newJob = new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis, JobStatus.NO_LATEST_RUNTIME, numFailures, numSystemStops, - failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis()); + failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis(), + failureToReschedule.getCumulativeExecutionTimeMs()); if (stopReason == JobParameters.STOP_REASON_USER) { // Demote all jobs to regular for user stops so they don't keep privileges. newJob.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER); } + if (newJob.getCumulativeExecutionTimeMs() >= mConstants.RUNTIME_CUMULATIVE_UI_LIMIT_MS + && newJob.shouldTreatAsUserInitiatedJob()) { + newJob.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ); + } if (job.isPeriodic()) { newJob.setOriginalLatestRunTimeElapsed( failureToReschedule.getOriginalLatestRunTimeElapsed()); @@ -2548,7 +2570,8 @@ public class JobSchedulerService extends com.android.server.SystemService elapsedNow + period - flex, elapsedNow + period, 0 /* numFailures */, 0 /* numSystemStops */, sSystemClock.millis() /* lastSuccessfulRunTime */, - periodicToReschedule.getLastFailedRunTime()); + periodicToReschedule.getLastFailedRunTime(), + 0 /* Reset cumulativeExecutionTime because of successful execution */); } final long newEarliestRunTimeElapsed = newLatestRuntimeElapsed @@ -2563,7 +2586,8 @@ public class JobSchedulerService extends com.android.server.SystemService newEarliestRunTimeElapsed, newLatestRuntimeElapsed, 0 /* numFailures */, 0 /* numSystemStops */, sSystemClock.millis() /* lastSuccessfulRunTime */, - periodicToReschedule.getLastFailedRunTime()); + periodicToReschedule.getLastFailedRunTime(), + 0 /* Reset cumulativeExecutionTime because of successful execution */); } // JobCompletedListener implementations. diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index 7388fff17735..b080bf31fed4 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -35,7 +35,6 @@ import android.app.job.JobProtoEnums; import android.app.job.JobWorkItem; import android.app.usage.UsageStatsManagerInternal; import android.compat.annotation.ChangeId; -import android.compat.annotation.Disabled; import android.compat.annotation.EnabledAfter; import android.content.ComponentName; import android.content.Context; @@ -97,9 +96,7 @@ public final class JobServiceContext implements ServiceConnection { * Whether to trigger an ANR when apps are slow to respond on pre-UDC APIs and functionality. */ @ChangeId - @Disabled - // TODO(258236856): Enable after test is fixed - // @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) private static final long ANR_PRE_UDC_APIS_ON_SLOW_RESPONSES = 258236856L; private static final String TAG = "JobServiceContext"; @@ -109,6 +106,7 @@ public final class JobServiceContext implements ServiceConnection { private static final long OP_TIMEOUT_MILLIS = 8 * 1000 * Build.HW_TIMEOUT_MULTIPLIER; /** Amount of time the JobScheduler will wait for a job to provide a required notification. */ private static final long NOTIFICATION_TIMEOUT_MILLIS = 10_000L * Build.HW_TIMEOUT_MULTIPLIER; + private static final long EXECUTION_DURATION_STAMP_PERIOD_MILLIS = 5 * 60_000L; private static final String[] VERB_STRINGS = { "VERB_BINDING", "VERB_STARTING", "VERB_EXECUTING", "VERB_STOPPING", "VERB_FINISHED" @@ -194,6 +192,8 @@ public final class JobServiceContext implements ServiceConnection { private long mMaxExecutionTimeMillis; /** Whether this job is required to provide a notification and we're still waiting for it. */ private boolean mAwaitingNotification; + /** The last time we updated the job's execution duration, in the elapsed realtime timebase. */ + private long mLastExecutionDurationStampTimeElapsed; private long mEstimatedDownloadBytes; private long mEstimatedUploadBytes; @@ -1248,7 +1248,15 @@ public final class JobServiceContext implements ServiceConnection { /* anrMessage */ "required notification not provided", /* triggerAnr */ true); } else { - Slog.e(TAG, "Unexpected op timeout while EXECUTING"); + final long timeSinceDurationStampTimeMs = + nowElapsed - mLastExecutionDurationStampTimeElapsed; + if (timeSinceDurationStampTimeMs < EXECUTION_DURATION_STAMP_PERIOD_MILLIS) { + Slog.e(TAG, "Unexpected op timeout while EXECUTING"); + } + // Update the execution time even if this wasn't the pre-set time. + mRunningJob.incrementCumulativeExecutionTime(timeSinceDurationStampTimeMs); + mService.mJobs.touchJob(mRunningJob); + mLastExecutionDurationStampTimeElapsed = nowElapsed; scheduleOpTimeOutLocked(); } break; @@ -1317,8 +1325,11 @@ public final class JobServiceContext implements ServiceConnection { Slog.d(TAG, "Cleaning up " + mRunningJob.toShortString() + " reschedule=" + reschedule + " reason=" + loggingDebugReason); } + final long nowElapsed = sElapsedRealtimeClock.millis(); applyStoppedReasonLocked(loggingDebugReason); completedJob = mRunningJob; + completedJob.incrementCumulativeExecutionTime( + nowElapsed - mLastExecutionDurationStampTimeElapsed); // Use the JobParameters stop reasons for logging and metric purposes, // but if the job was marked for death, use that reason for rescheduling purposes. // The discrepancy could happen if a job ends up stopping for some reason @@ -1345,7 +1356,7 @@ public final class JobServiceContext implements ServiceConnection { mPreviousJobHadSuccessfulFinish = (loggingInternalStopReason == JobParameters.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH); if (!mPreviousJobHadSuccessfulFinish) { - mLastUnsuccessfulFinishElapsed = sElapsedRealtimeClock.millis(); + mLastUnsuccessfulFinishElapsed = nowElapsed; } mJobPackageTracker.noteInactive(completedJob, loggingInternalStopReason, loggingDebugReason); @@ -1414,6 +1425,7 @@ public final class JobServiceContext implements ServiceConnection { mDeathMarkStopReason = JobParameters.STOP_REASON_UNDEFINED; mDeathMarkInternalStopReason = 0; mDeathMarkDebugReason = null; + mLastExecutionDurationStampTimeElapsed = 0; mPendingStopReason = JobParameters.STOP_REASON_UNDEFINED; mPendingInternalStopReason = 0; mPendingDebugStopReason = null; @@ -1463,6 +1475,7 @@ public final class JobServiceContext implements ServiceConnection { if (mAwaitingNotification) { minTimeout = Math.min(minTimeout, NOTIFICATION_TIMEOUT_MILLIS); } + minTimeout = Math.min(minTimeout, EXECUTION_DURATION_STAMP_PERIOD_MILLIS); timeoutMillis = minTimeout; break; diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java index a96a4ef951ea..c5405171edd0 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java @@ -236,7 +236,8 @@ public final class JobStore { convertRtcBoundsToElapsed(utcTimes, elapsedNow); JobStatus newJob = new JobStatus(job, elapsedRuntimes.first, elapsedRuntimes.second, - 0, 0, job.getLastSuccessfulRunTime(), job.getLastFailedRunTime()); + 0, 0, job.getLastSuccessfulRunTime(), job.getLastFailedRunTime(), + job.getCumulativeExecutionTimeMs()); newJob.prepareLocked(); toAdd.add(newJob); toRemove.add(job); @@ -786,7 +787,7 @@ public final class JobStore { * Write out a tag with data comprising the required fields and bias of this job and * its client. */ - private void addAttributesToJobTag(XmlSerializer out, JobStatus jobStatus) + private void addAttributesToJobTag(TypedXmlSerializer out, JobStatus jobStatus) throws IOException { out.attribute(null, "jobid", Integer.toString(jobStatus.getJobId())); out.attribute(null, "package", jobStatus.getServiceComponent().getPackageName()); @@ -813,6 +814,9 @@ public final class JobStore { String.valueOf(jobStatus.getLastSuccessfulRunTime())); out.attribute(null, "lastFailedRunTime", String.valueOf(jobStatus.getLastFailedRunTime())); + + out.attributeLong(null, "cumulativeExecutionTime", + jobStatus.getCumulativeExecutionTimeMs()); } private void writeBundleToXml(PersistableBundle extras, XmlSerializer out) @@ -1190,6 +1194,7 @@ public final class JobStore { int uid, sourceUserId; long lastSuccessfulRunTime; long lastFailedRunTime; + long cumulativeExecutionTime; int internalFlags = 0; // Read out job identifier attributes and bias. @@ -1230,6 +1235,9 @@ public final class JobStore { val = parser.getAttributeValue(null, "lastFailedRunTime"); lastFailedRunTime = val == null ? 0 : Long.parseLong(val); + + cumulativeExecutionTime = + parser.getAttributeLong(null, "cumulativeExecutionTime", 0); } catch (NumberFormatException e) { Slog.e(TAG, "Error parsing job's required fields, skipping"); return null; @@ -1402,7 +1410,7 @@ public final class JobStore { builtJob, uid, sourcePackageName, sourceUserId, appBucket, namespace, sourceTag, elapsedRuntimes.first, elapsedRuntimes.second, - lastSuccessfulRunTime, lastFailedRunTime, + lastSuccessfulRunTime, lastFailedRunTime, cumulativeExecutionTime, (rtcIsGood) ? null : rtcRuntimes, internalFlags, /* dynamicConstraints */ 0); if (jobWorkItems != null) { for (int i = 0; i < jobWorkItems.size(); ++i) { diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index 17dde9098926..26d6ba254f8a 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -375,6 +375,11 @@ public final class JobStatus { * and is thus considered demoted from whatever privileged state it had in the past. */ public static final int INTERNAL_FLAG_DEMOTED_BY_USER = 1 << 1; + /** + * Flag for {@link #mInternalFlags}: this job is demoted by the system + * from running as a user-initiated job. + */ + public static final int INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ = 1 << 2; /** Minimum difference between start and end time to have flexible constraint */ @VisibleForTesting @@ -385,6 +390,12 @@ public final class JobStatus { */ private int mInternalFlags; + /** + * The cumulative amount of time this job has run for, including previous executions. + * This is reset for periodic jobs upon a successful job execution. + */ + private long mCumulativeExecutionTimeMs; + // These are filled in by controllers when preparing for execution. public ArraySet<Uri> changedUris; public ArraySet<String> changedAuthorities; @@ -550,7 +561,8 @@ public final class JobStatus { int sourceUserId, int standbyBucket, @Nullable String namespace, String tag, int numFailures, int numSystemStops, long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis, - long lastSuccessfulRunTime, long lastFailedRunTime, int internalFlags, + long lastSuccessfulRunTime, long lastFailedRunTime, long cumulativeExecutionTimeMs, + int internalFlags, int dynamicConstraints) { this.job = job; this.callingUid = callingUid; @@ -650,6 +662,8 @@ public final class JobStatus { mReadyDynamicSatisfied = false; } + mCumulativeExecutionTimeMs = cumulativeExecutionTimeMs; + mLastSuccessfulRunTime = lastSuccessfulRunTime; mLastFailedRunTime = lastFailedRunTime; @@ -684,6 +698,7 @@ public final class JobStatus { jobStatus.getSourceTag(), jobStatus.getNumFailures(), jobStatus.getNumSystemStops(), jobStatus.getEarliestRunTime(), jobStatus.getLatestRunTimeElapsed(), jobStatus.getLastSuccessfulRunTime(), jobStatus.getLastFailedRunTime(), + jobStatus.getCumulativeExecutionTimeMs(), jobStatus.getInternalFlags(), jobStatus.mDynamicConstraints); mPersistedUtcTimes = jobStatus.mPersistedUtcTimes; if (jobStatus.mPersistedUtcTimes != null) { @@ -711,13 +726,15 @@ public final class JobStatus { int standbyBucket, @Nullable String namespace, String sourceTag, long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis, long lastSuccessfulRunTime, long lastFailedRunTime, + long cumulativeExecutionTimeMs, Pair<Long, Long> persistedExecutionTimesUTC, int innerFlags, int dynamicConstraints) { this(job, callingUid, sourcePkgName, sourceUserId, standbyBucket, namespace, sourceTag, /* numFailures */ 0, /* numSystemStops */ 0, earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, - lastSuccessfulRunTime, lastFailedRunTime, innerFlags, dynamicConstraints); + lastSuccessfulRunTime, lastFailedRunTime, cumulativeExecutionTimeMs, + innerFlags, dynamicConstraints); // Only during initial inflation do we record the UTC-timebase execution bounds // read from the persistent store. If we ever have to recreate the JobStatus on @@ -735,14 +752,16 @@ public final class JobStatus { public JobStatus(JobStatus rescheduling, long newEarliestRuntimeElapsedMillis, long newLatestRuntimeElapsedMillis, int numFailures, int numSystemStops, - long lastSuccessfulRunTime, long lastFailedRunTime) { + long lastSuccessfulRunTime, long lastFailedRunTime, + long cumulativeExecutionTimeMs) { this(rescheduling.job, rescheduling.getUid(), rescheduling.getSourcePackageName(), rescheduling.getSourceUserId(), rescheduling.getStandbyBucket(), rescheduling.getNamespace(), rescheduling.getSourceTag(), numFailures, numSystemStops, newEarliestRuntimeElapsedMillis, newLatestRuntimeElapsedMillis, - lastSuccessfulRunTime, lastFailedRunTime, rescheduling.getInternalFlags(), + lastSuccessfulRunTime, lastFailedRunTime, cumulativeExecutionTimeMs, + rescheduling.getInternalFlags(), rescheduling.mDynamicConstraints); } @@ -780,6 +799,7 @@ public final class JobStatus { standbyBucket, namespace, tag, /* numFailures */ 0, /* numSystemStops */ 0, earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, 0 /* lastSuccessfulRunTime */, 0 /* lastFailedRunTime */, + /* cumulativeExecutionTime */ 0, /*innerFlags=*/ 0, /* dynamicConstraints */ 0); } @@ -1312,6 +1332,14 @@ public final class JobStatus { return job.isPersisted(); } + public long getCumulativeExecutionTimeMs() { + return mCumulativeExecutionTimeMs; + } + + public void incrementCumulativeExecutionTime(long incrementMs) { + mCumulativeExecutionTimeMs += incrementMs; + } + public long getEarliestRunTime() { return earliestRunTimeElapsedMillis; } @@ -1405,7 +1433,8 @@ public final class JobStatus { */ public boolean shouldTreatAsUserInitiatedJob() { return getJob().isUserInitiated() - && (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_USER) == 0; + && (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_USER) == 0 + && (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ) == 0; } /** @@ -2124,9 +2153,9 @@ public final class JobStatus { sb.append(" READY"); } else { sb.append(" satisfied:0x").append(Integer.toHexString(satisfiedConstraints)); + final int requiredConstraints = mRequiredConstraintsOfInterest | IMPLICIT_CONSTRAINTS; sb.append(" unsatisfied:0x").append(Integer.toHexString( - (satisfiedConstraints & (mRequiredConstraintsOfInterest | IMPLICIT_CONSTRAINTS)) - ^ mRequiredConstraintsOfInterest)); + (satisfiedConstraints & requiredConstraints) ^ requiredConstraints)); } sb.append("}"); return sb.toString(); @@ -2655,6 +2684,11 @@ public final class JobStatus { pw.print(", original latest="); formatRunTime(pw, mOriginalLatestRunTimeElapsedMillis, NO_LATEST_RUNTIME, nowElapsed); pw.println(); + if (mCumulativeExecutionTimeMs != 0) { + pw.print("Cumulative execution time="); + TimeUtils.formatDuration(mCumulativeExecutionTimeMs, pw); + pw.println(); + } if (numFailures != 0) { pw.print("Num failures: "); pw.println(numFailures); } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java index 4d8b3e147880..d2150b80761f 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java @@ -182,7 +182,7 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { if (mIrs.isPackageExempted(userId, pkgName)) { return mMinSatiatedBalanceExempted; } - if (mIrs.isHeadlessSystemApp(pkgName)) { + if (mIrs.isHeadlessSystemApp(userId, pkgName)) { return mMinSatiatedBalanceHeadlessSystemApp; } // TODO: take other exemptions into account diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java index dffed0f4a190..49c6d1b928d7 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.AppGlobals; import android.content.Context; +import android.content.Intent; import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; @@ -35,9 +36,23 @@ import com.android.internal.util.ArrayUtils; class InstalledPackageInfo { static final int NO_UID = -1; + /** + * Flags to use when querying for front door activities. Disabled components are included + * are included for completeness since the app can enable them at any time. + */ + private static final int HEADLESS_APP_QUERY_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE + | PackageManager.MATCH_DISABLED_COMPONENTS; + public final int uid; public final String packageName; public final boolean hasCode; + /** + * Whether the app is a system app that is "headless." Headless in this context means that + * the app doesn't have any "front door" activities --- activities that would show in the + * launcher. + */ + public final boolean isHeadlessSystemApp; public final boolean isSystemInstaller; @Nullable public final String installerPackageName; @@ -48,6 +63,17 @@ class InstalledPackageInfo { uid = applicationInfo == null ? NO_UID : applicationInfo.uid; packageName = packageInfo.packageName; hasCode = applicationInfo != null && applicationInfo.hasCode(); + + final PackageManager packageManager = context.getPackageManager(); + final Intent frontDoorActivityIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setPackage(packageName); + isHeadlessSystemApp = applicationInfo != null + && (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp()) + && ArrayUtils.isEmpty( + packageManager.queryIntentActivitiesAsUser( + frontDoorActivityIntent, HEADLESS_APP_QUERY_FLAGS, userId)); + isSystemInstaller = applicationInfo != null && ArrayUtils.indexOf( packageInfo.requestedPermissions, Manifest.permission.INSTALL_PACKAGES) >= 0 @@ -65,4 +91,16 @@ class InstalledPackageInfo { installerPackageName = installSourceInfo == null ? null : installSourceInfo.getInstallingPackageName(); } + + @Override + public String toString() { + return "IPO{" + + "uid=" + uid + + ", pkgName=" + packageName + + (hasCode ? " HAS_CODE" : "") + + (isHeadlessSystemApp ? " HEADLESS_SYSTEM" : "") + + (isSystemInstaller ? " SYSTEM_INSTALLER" : "") + + ", installer=" + installerPackageName + + '}'; + } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 1c915bc17604..7f6a75e75397 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -501,12 +501,16 @@ public class InternalResourceService extends SystemService { } } - boolean isHeadlessSystemApp(@NonNull String pkgName) { + boolean isHeadlessSystemApp(final int userId, @NonNull String pkgName) { if (pkgName == null) { Slog.wtfStack(TAG, "isHeadlessSystemApp called with null package"); return false; } synchronized (mLock) { + final InstalledPackageInfo ipo = getInstalledPackageInfo(userId, pkgName); + if (ipo != null && ipo.isHeadlessSystemApp) { + return true; + } // The wellbeing app is pre-set on the device, not expected to be interacted with // much by the user, but can be expected to do work in the background on behalf of // the user. As such, it's a pseudo-headless system app, so treat it as a headless @@ -1754,6 +1758,10 @@ public class InternalResourceService extends SystemService { pw.print("Exempted apps", mExemptedApps); pw.println(); + pw.println(); + pw.print("Wellbeing app="); + pw.println(mWellbeingPackage == null ? "None" : mWellbeingPackage); + boolean printedVips = false; pw.println(); pw.print("VIPs:"); @@ -1832,6 +1840,37 @@ public class InternalResourceService extends SystemService { pw.println(); mAnalyst.dump(pw); + + // Put this at the end since this may be a lot and we want to have the earlier + // information easily accessible. + boolean printedInterestingIpos = false; + pw.println(); + pw.print("Interesting apps:"); + pw.increaseIndent(); + for (int u = 0; u < mPkgCache.numMaps(); ++u) { + for (int p = 0; p < mPkgCache.numElementsForKeyAt(u); ++p) { + final InstalledPackageInfo ipo = mPkgCache.valueAt(u, p); + + // Printing out every single app will be too much. Only print apps that + // have some interesting characteristic. + final boolean isInteresting = ipo.hasCode + && ipo.isHeadlessSystemApp + && !UserHandle.isCore(ipo.uid); + if (!isInteresting) { + continue; + } + + printedInterestingIpos = true; + pw.println(); + pw.print(ipo); + } + } + if (printedInterestingIpos) { + pw.println(); + } else { + pw.print(" None"); + } + pw.decreaseIndent(); } } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java index 526e87683d30..91a291fe20db 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java @@ -197,7 +197,7 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { final long baseBalance; if (mIrs.isPackageExempted(userId, pkgName)) { baseBalance = mMinSatiatedBalanceExempted; - } else if (mIrs.isHeadlessSystemApp(pkgName)) { + } else if (mIrs.isHeadlessSystemApp(userId, pkgName)) { baseBalance = mMinSatiatedBalanceHeadlessSystemApp; } else { baseBalance = mMinSatiatedBalanceOther; diff --git a/core/api/current.txt b/core/api/current.txt index b91144b3a045..4332d21b297c 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -2015,18 +2015,14 @@ package android { field public static final int system_on_primary_container_dark; field public static final int system_on_primary_container_light; field public static final int system_on_primary_dark; - field public static final int system_on_primary_fixed_dark; - field public static final int system_on_primary_fixed_light; - field public static final int system_on_primary_fixed_variant_dark; - field public static final int system_on_primary_fixed_variant_light; + field public static final int system_on_primary_fixed; + field public static final int system_on_primary_fixed_variant; field public static final int system_on_primary_light; field public static final int system_on_secondary_container_dark; field public static final int system_on_secondary_container_light; field public static final int system_on_secondary_dark; - field public static final int system_on_secondary_fixed_dark; - field public static final int system_on_secondary_fixed_light; - field public static final int system_on_secondary_fixed_variant_dark; - field public static final int system_on_secondary_fixed_variant_light; + field public static final int system_on_secondary_fixed; + field public static final int system_on_secondary_fixed_variant; field public static final int system_on_secondary_light; field public static final int system_on_surface_dark; field public static final int system_on_surface_light; @@ -2035,10 +2031,8 @@ package android { field public static final int system_on_tertiary_container_dark; field public static final int system_on_tertiary_container_light; field public static final int system_on_tertiary_dark; - field public static final int system_on_tertiary_fixed_dark; - field public static final int system_on_tertiary_fixed_light; - field public static final int system_on_tertiary_fixed_variant_dark; - field public static final int system_on_tertiary_fixed_variant_light; + field public static final int system_on_tertiary_fixed; + field public static final int system_on_tertiary_fixed_variant; field public static final int system_on_tertiary_light; field public static final int system_outline_dark; field public static final int system_outline_light; @@ -2057,18 +2051,14 @@ package android { field public static final int system_primary_container_dark; field public static final int system_primary_container_light; field public static final int system_primary_dark; - field public static final int system_primary_fixed_dark; - field public static final int system_primary_fixed_dim_dark; - field public static final int system_primary_fixed_dim_light; - field public static final int system_primary_fixed_light; + field public static final int system_primary_fixed; + field public static final int system_primary_fixed_dim; field public static final int system_primary_light; field public static final int system_secondary_container_dark; field public static final int system_secondary_container_light; field public static final int system_secondary_dark; - field public static final int system_secondary_fixed_dark; - field public static final int system_secondary_fixed_dim_dark; - field public static final int system_secondary_fixed_dim_light; - field public static final int system_secondary_fixed_light; + field public static final int system_secondary_fixed; + field public static final int system_secondary_fixed_dim; field public static final int system_secondary_light; field public static final int system_surface_bright_dark; field public static final int system_surface_bright_light; @@ -2091,10 +2081,8 @@ package android { field public static final int system_tertiary_container_dark; field public static final int system_tertiary_container_light; field public static final int system_tertiary_dark; - field public static final int system_tertiary_fixed_dark; - field public static final int system_tertiary_fixed_dim_dark; - field public static final int system_tertiary_fixed_dim_light; - field public static final int system_tertiary_fixed_light; + field public static final int system_tertiary_fixed; + field public static final int system_tertiary_fixed_dim; field public static final int system_tertiary_light; field public static final int system_text_hint_inverse_dark; field public static final int system_text_hint_inverse_light; @@ -40591,7 +40579,7 @@ package android.service.controls.templates { package android.service.credentials { - public class Action implements android.os.Parcelable { + public final class Action implements android.os.Parcelable { ctor public Action(@NonNull android.app.slice.Slice); method public int describeContents(); method @NonNull public android.app.slice.Slice getSlice(); @@ -40599,7 +40587,7 @@ package android.service.credentials { field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.Action> CREATOR; } - public class BeginCreateCredentialRequest implements android.os.Parcelable { + public final class BeginCreateCredentialRequest implements android.os.Parcelable { ctor public BeginCreateCredentialRequest(@NonNull String, @NonNull android.os.Bundle, @Nullable android.service.credentials.CallingAppInfo); ctor public BeginCreateCredentialRequest(@NonNull String, @NonNull android.os.Bundle); method public int describeContents(); @@ -40627,7 +40615,7 @@ package android.service.credentials { method @NonNull @RequiresPermission(android.Manifest.permission.PROVIDE_REMOTE_CREDENTIALS) public android.service.credentials.BeginCreateCredentialResponse.Builder setRemoteCreateEntry(@Nullable android.service.credentials.RemoteEntry); } - public class BeginGetCredentialOption implements android.os.Parcelable { + public final class BeginGetCredentialOption implements android.os.Parcelable { ctor public BeginGetCredentialOption(@NonNull String, @NonNull String, @NonNull android.os.Bundle); method public int describeContents(); method @NonNull public android.os.Bundle getCandidateQueryData(); @@ -40706,7 +40694,7 @@ package android.service.credentials { field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.CreateCredentialRequest> CREATOR; } - public class CreateEntry implements android.os.Parcelable { + public final class CreateEntry implements android.os.Parcelable { ctor public CreateEntry(@NonNull android.app.slice.Slice); method public int describeContents(); method @NonNull public android.app.slice.Slice getSlice(); @@ -40714,7 +40702,7 @@ package android.service.credentials { field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.CreateEntry> CREATOR; } - public class CredentialEntry implements android.os.Parcelable { + public final class CredentialEntry implements android.os.Parcelable { ctor public CredentialEntry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice); ctor public CredentialEntry(@NonNull android.service.credentials.BeginGetCredentialOption, @NonNull android.app.slice.Slice); ctor public CredentialEntry(@NonNull String, @NonNull android.app.slice.Slice); @@ -40754,7 +40742,7 @@ package android.service.credentials { field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.GetCredentialRequest> CREATOR; } - public class RemoteEntry implements android.os.Parcelable { + public final class RemoteEntry implements android.os.Parcelable { ctor public RemoteEntry(@NonNull android.app.slice.Slice); method public int describeContents(); method @NonNull public android.app.slice.Slice getSlice(); @@ -54340,7 +54328,6 @@ package android.view.accessibility { method public android.view.accessibility.AccessibilityWindowInfo getWindow(); method public int getWindowId(); method public boolean hasRequestInitialAccessibilityFocus(); - method public boolean hasRequestTouchPassthrough(); method public boolean isAccessibilityDataSensitive(); method public boolean isAccessibilityFocused(); method public boolean isCheckable(); @@ -54424,7 +54411,6 @@ package android.view.accessibility { method public void setQueryFromAppProcessEnabled(@NonNull android.view.View, boolean); method public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo.RangeInfo); method public void setRequestInitialAccessibilityFocus(boolean); - method public void setRequestTouchPassthrough(boolean); method public void setScreenReaderFocusable(boolean); method public void setScrollable(boolean); method public void setSelected(boolean); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 6177a9f0500f..b21028464426 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3263,6 +3263,7 @@ package android.companion.virtual { method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setVirtualSensorCallback(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.sensor.VirtualSensorCallback); + method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setVirtualSensorDirectChannelCallback(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.sensor.VirtualSensorDirectChannelCallback); } } @@ -3326,16 +3327,18 @@ package android.companion.virtual.sensor { public interface VirtualSensorCallback { method public void onConfigurationChanged(@NonNull android.companion.virtual.sensor.VirtualSensor, boolean, @NonNull java.time.Duration, @NonNull java.time.Duration); - method public default void onDirectChannelConfigured(@IntRange(from=1) int, @NonNull android.companion.virtual.sensor.VirtualSensor, int, @IntRange(from=1) int); - method public default void onDirectChannelCreated(@IntRange(from=1) int, @NonNull android.os.SharedMemory); - method public default void onDirectChannelDestroyed(@IntRange(from=1) int); } public final class VirtualSensorConfig implements android.os.Parcelable { method public int describeContents(); method public int getDirectChannelTypesSupported(); method public int getHighestDirectReportRateLevel(); + method public int getMaxDelay(); + method public float getMaximumRange(); + method public int getMinDelay(); method @NonNull public String getName(); + method public float getPower(); + method public float getResolution(); method public int getType(); method @Nullable public String getVendor(); method public void writeToParcel(@NonNull android.os.Parcel, int); @@ -3347,9 +3350,29 @@ package android.companion.virtual.sensor { method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig build(); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setDirectChannelTypesSupported(int); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setHighestDirectReportRateLevel(int); + method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMaxDelay(int); + method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMaximumRange(float); + method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMinDelay(int); + method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setPower(float); + method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setResolution(float); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setVendor(@Nullable String); } + public interface VirtualSensorDirectChannelCallback { + method public void onDirectChannelConfigured(@IntRange(from=1) int, @NonNull android.companion.virtual.sensor.VirtualSensor, int, @IntRange(from=1) int); + method public void onDirectChannelCreated(@IntRange(from=1) int, @NonNull android.os.SharedMemory); + method public void onDirectChannelDestroyed(@IntRange(from=1) int); + } + + public final class VirtualSensorDirectChannelWriter implements java.lang.AutoCloseable { + ctor public VirtualSensorDirectChannelWriter(); + method public void addChannel(@IntRange(from=1) int, @NonNull android.os.SharedMemory) throws android.system.ErrnoException; + method public void close(); + method public boolean configureChannel(@IntRange(from=1) int, @NonNull android.companion.virtual.sensor.VirtualSensor, int, @IntRange(from=1) int); + method public void removeChannel(@IntRange(from=1) int); + method public boolean writeSensorEvent(@NonNull android.companion.virtual.sensor.VirtualSensor, @NonNull android.companion.virtual.sensor.VirtualSensorEvent); + } + public final class VirtualSensorEvent implements android.os.Parcelable { method public int describeContents(); method public long getTimestampNanos(); @@ -4957,6 +4980,7 @@ package android.hardware.input { public final class VirtualKeyEvent implements android.os.Parcelable { method public int describeContents(); method public int getAction(); + method public long getEventTimeNanos(); method public int getKeyCode(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final int ACTION_DOWN = 0; // 0x0 @@ -4968,6 +4992,7 @@ package android.hardware.input { ctor public VirtualKeyEvent.Builder(); method @NonNull public android.hardware.input.VirtualKeyEvent build(); method @NonNull public android.hardware.input.VirtualKeyEvent.Builder setAction(int); + method @NonNull public android.hardware.input.VirtualKeyEvent.Builder setEventTimeNanos(long); method @NonNull public android.hardware.input.VirtualKeyEvent.Builder setKeyCode(int); } @@ -5005,6 +5030,7 @@ package android.hardware.input { method public int describeContents(); method public int getAction(); method public int getButtonCode(); + method public long getEventTimeNanos(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final int ACTION_BUTTON_PRESS = 11; // 0xb field public static final int ACTION_BUTTON_RELEASE = 12; // 0xc @@ -5021,6 +5047,7 @@ package android.hardware.input { method @NonNull public android.hardware.input.VirtualMouseButtonEvent build(); method @NonNull public android.hardware.input.VirtualMouseButtonEvent.Builder setAction(int); method @NonNull public android.hardware.input.VirtualMouseButtonEvent.Builder setButtonCode(int); + method @NonNull public android.hardware.input.VirtualMouseButtonEvent.Builder setEventTimeNanos(long); } public final class VirtualMouseConfig extends android.hardware.input.VirtualInputDeviceConfig implements android.os.Parcelable { @@ -5036,6 +5063,7 @@ package android.hardware.input { public final class VirtualMouseRelativeEvent implements android.os.Parcelable { method public int describeContents(); + method public long getEventTimeNanos(); method public float getRelativeX(); method public float getRelativeY(); method public void writeToParcel(@NonNull android.os.Parcel, int); @@ -5045,12 +5073,14 @@ package android.hardware.input { public static final class VirtualMouseRelativeEvent.Builder { ctor public VirtualMouseRelativeEvent.Builder(); method @NonNull public android.hardware.input.VirtualMouseRelativeEvent build(); + method @NonNull public android.hardware.input.VirtualMouseRelativeEvent.Builder setEventTimeNanos(long); method @NonNull public android.hardware.input.VirtualMouseRelativeEvent.Builder setRelativeX(float); method @NonNull public android.hardware.input.VirtualMouseRelativeEvent.Builder setRelativeY(float); } public final class VirtualMouseScrollEvent implements android.os.Parcelable { method public int describeContents(); + method public long getEventTimeNanos(); method public float getXAxisMovement(); method public float getYAxisMovement(); method public void writeToParcel(@NonNull android.os.Parcel, int); @@ -5060,6 +5090,7 @@ package android.hardware.input { public static final class VirtualMouseScrollEvent.Builder { ctor public VirtualMouseScrollEvent.Builder(); method @NonNull public android.hardware.input.VirtualMouseScrollEvent build(); + method @NonNull public android.hardware.input.VirtualMouseScrollEvent.Builder setEventTimeNanos(long); method @NonNull public android.hardware.input.VirtualMouseScrollEvent.Builder setXAxisMovement(@FloatRange(from=-1.0F, to=1.0f) float); method @NonNull public android.hardware.input.VirtualMouseScrollEvent.Builder setYAxisMovement(@FloatRange(from=-1.0F, to=1.0f) float); } @@ -5085,6 +5116,7 @@ package android.hardware.input { public final class VirtualTouchEvent implements android.os.Parcelable { method public int describeContents(); method public int getAction(); + method public long getEventTimeNanos(); method public float getMajorAxisSize(); method public int getPointerId(); method public float getPressure(); @@ -5105,6 +5137,7 @@ package android.hardware.input { ctor public VirtualTouchEvent.Builder(); method @NonNull public android.hardware.input.VirtualTouchEvent build(); method @NonNull public android.hardware.input.VirtualTouchEvent.Builder setAction(int); + method @NonNull public android.hardware.input.VirtualTouchEvent.Builder setEventTimeNanos(long); method @NonNull public android.hardware.input.VirtualTouchEvent.Builder setMajorAxisSize(@FloatRange(from=0.0f) float); method @NonNull public android.hardware.input.VirtualTouchEvent.Builder setPointerId(@IntRange(from=0, to=0x10 - 1) int); method @NonNull public android.hardware.input.VirtualTouchEvent.Builder setPressure(@FloatRange(from=0.0f) float); @@ -10145,11 +10178,11 @@ package android.net.wifi.sharedconnectivity.app { } public static final class SharedConnectivitySettingsState.Builder { - ctor public SharedConnectivitySettingsState.Builder(@NonNull android.content.Context); + ctor public SharedConnectivitySettingsState.Builder(); method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState build(); method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setExtras(@NonNull android.os.Bundle); method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setInstantTetherEnabled(boolean); - method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setInstantTetherSettingsPendingIntent(@NonNull android.content.Intent); + method @NonNull public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.Builder setInstantTetherSettingsPendingIntent(@NonNull android.app.PendingIntent); } } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 999075d60e4c..0ba56b97d510 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -3052,7 +3052,7 @@ public class ApplicationPackageManager extends PackageManager { mPM.setComponentEnabledSetting(componentName, enabled ? COMPONENT_ENABLED_STATE_DEFAULT : COMPONENT_ENABLED_STATE_DISABLED, - DONT_KILL_APP, getUserId()); + DONT_KILL_APP, getUserId(), mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3075,7 +3075,8 @@ public class ApplicationPackageManager extends PackageManager { public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) { try { - mPM.setComponentEnabledSetting(componentName, newState, flags, getUserId()); + mPM.setComponentEnabledSetting(componentName, newState, flags, getUserId(), + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3084,7 +3085,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public void setComponentEnabledSettings(List<ComponentEnabledSetting> settings) { try { - mPM.setComponentEnabledSettings(settings, getUserId()); + mPM.setComponentEnabledSettings(settings, getUserId(), mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 0cd42a364016..82f4315d033e 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -3619,6 +3619,17 @@ class ContextImpl extends Context { scheduleFinalCleanup(getClass().getName(), getOuterContext().getClass().getSimpleName()); } + @Override + public void closeSystemDialogs() { + final Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) + .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + final Bundle options = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeferralPolicy(BroadcastOptions.DEFERRAL_POLICY_UNTIL_ACTIVE) + .toBundle(); + sendBroadcast(intent, null /* receiverPermission */, options); + } + // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 403acad6bba1..97d45623d3da 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -108,6 +108,15 @@ interface IActivityManager { int getUidProcessState(int uid, in String callingPackage); @UnsupportedAppUsage int checkPermission(in String permission, int pid, int uid); + + /** Logs start of an API call to associate with an FGS, used for FGS Type Metrics */ + void logFgsApiBegin(int apiType, int appUid, int appPid); + + /** Logs stop of an API call to associate with an FGS, used for FGS Type Metrics */ + void logFgsApiEnd(int apiType, int appUid, int appPid); + + /** Logs API state change to associate with an FGS, used for FGS Type Metrics */ + void logFgsApiStateChanged(int apiType, int state, int appUid, int appPid); // =============== End of transactions used on native side as well ============================ // Special low-level communication with activity manager. @@ -870,16 +879,6 @@ interface IActivityManager { /** Returns if the service is a short-service is still "alive" and past the timeout. */ boolean shouldServiceTimeOut(in ComponentName className, in IBinder token); - /** Logs start of an API call to associate with an FGS, used for FGS Type Metrics */ - void logFgsApiBegin(int apiType, int appUid, int appPid); - - /** Logs stop of an API call to associate with an FGS, used for FGS Type Metrics */ - void logFgsApiEnd(int apiType, int appUid, int appPid); - - /** Logs API state change to associate with an FGS, used for FGS Type Metrics */ - void logFgsApiStateChanged(int apiType, int state, int appUid, int appPid); - - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)") void registerUidFrozenStateChangedCallback(in IUidFrozenStateChangedCallback callback); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)") void unregisterUidFrozenStateChangedCallback(in IUidFrozenStateChangedCallback callback); diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 4dc7253c27dc..c131ce574d2c 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -28,6 +28,7 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.hardware.input.InputManager; +import android.hardware.input.InputManagerGlobal; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -1130,7 +1131,7 @@ public class Instrumentation { newEvent.setFlags(event.getFlags() | KeyEvent.FLAG_FROM_SYSTEM); setDisplayIfNeeded(newEvent); - InputManager.getInstance().injectInputEvent(newEvent, + InputManagerGlobal.getInstance().injectInputEvent(newEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } @@ -1229,7 +1230,7 @@ public class Instrumentation { } // Direct the injected event into windows owned by the instrumentation target. - InputManager.getInstance().injectInputEvent( + InputManagerGlobal.getInstance().injectInputEvent( event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH, Process.myUid()); if (syncAfter) { @@ -1259,7 +1260,7 @@ public class Instrumentation { if (!event.isFromSource(InputDevice.SOURCE_CLASS_TRACKBALL)) { event.setSource(InputDevice.SOURCE_TRACKBALL); } - InputManager.getInstance().injectInputEvent(event, + InputManagerGlobal.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 99de72480110..7aedd30d660e 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -5286,7 +5286,7 @@ public class Notification implements Parcelable boolean hasSecondLine = showProgress; if (p.hasTitle()) { contentView.setViewVisibility(p.mTitleViewId, View.VISIBLE); - contentView.setTextViewText(p.mTitleViewId, processTextSpans(p.mTitle)); + contentView.setTextViewText(p.mTitleViewId, ensureColorSpanContrast(p.mTitle, p)); setTextViewColorPrimary(contentView, p.mTitleViewId, p); } else if (p.mTitleViewId != R.id.title) { // This alternate title view ID is not cleared by resetStandardTemplate @@ -5296,7 +5296,7 @@ public class Notification implements Parcelable if (p.mText != null && p.mText.length() != 0 && (!showProgress || p.mAllowTextWithProgress)) { contentView.setViewVisibility(p.mTextViewId, View.VISIBLE); - contentView.setTextViewText(p.mTextViewId, processTextSpans(p.mText)); + contentView.setTextViewText(p.mTextViewId, ensureColorSpanContrast(p.mText, p)); setTextViewColorSecondary(contentView, p.mTextViewId, p); hasSecondLine = true; } else if (p.mTextViewId != R.id.text) { @@ -5323,13 +5323,6 @@ public class Notification implements Parcelable RemoteViews.MARGIN_BOTTOM, marginDimen); } - private CharSequence processTextSpans(CharSequence text) { - if (mInNightMode) { - return ContrastColorUtil.clearColorSpans(text); - } - return text; - } - private void setTextViewColorPrimary(RemoteViews contentView, @IdRes int id, StandardTemplateParams p) { contentView.setTextColor(id, getPrimaryTextColor(p)); @@ -5581,9 +5574,8 @@ public class Notification implements Parcelable headerText = mN.extras.getCharSequence(EXTRA_INFO_TEXT); } if (!TextUtils.isEmpty(headerText)) { - // TODO: Remove the span entirely to only have the string with propper formating. - contentView.setTextViewText(R.id.header_text, processTextSpans( - processLegacyText(headerText))); + contentView.setTextViewText(R.id.header_text, ensureColorSpanContrast( + processLegacyText(headerText), p)); setTextViewColorSecondary(contentView, R.id.header_text, p); contentView.setViewVisibility(R.id.header_text, View.VISIBLE); if (hasTextToLeft) { @@ -5604,8 +5596,8 @@ public class Notification implements Parcelable return false; } if (!TextUtils.isEmpty(p.mHeaderTextSecondary)) { - contentView.setTextViewText(R.id.header_text_secondary, processTextSpans( - processLegacyText(p.mHeaderTextSecondary))); + contentView.setTextViewText(R.id.header_text_secondary, ensureColorSpanContrast( + processLegacyText(p.mHeaderTextSecondary), p)); setTextViewColorSecondary(contentView, R.id.header_text_secondary, p); contentView.setViewVisibility(R.id.header_text_secondary, View.VISIBLE); if (hasTextToLeft) { @@ -5754,8 +5746,8 @@ public class Notification implements Parcelable private boolean isSnoozeSettingEnabled() { try { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0) == 1; + return Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0, UserHandle.USER_CURRENT) == 1; } catch (SecurityException ex) { // Most 3p apps can't access this snooze setting, so their NotificationListeners // would be unable to create notification views if we propagated this exception. @@ -5846,7 +5838,7 @@ public class Notification implements Parcelable big.setViewVisibility(R.id.notification_material_reply_text_1_container, View.VISIBLE); big.setTextViewText(R.id.notification_material_reply_text_1, - processTextSpans(replyText[0].getText())); + ensureColorSpanContrast(replyText[0].getText(), p)); setTextViewColorSecondary(big, R.id.notification_material_reply_text_1, p); big.setViewVisibility(R.id.notification_material_reply_progress, showSpinner ? View.VISIBLE : View.GONE); @@ -5858,7 +5850,7 @@ public class Notification implements Parcelable && p.maxRemoteInputHistory > 1) { big.setViewVisibility(R.id.notification_material_reply_text_2, View.VISIBLE); big.setTextViewText(R.id.notification_material_reply_text_2, - processTextSpans(replyText[1].getText())); + ensureColorSpanContrast(replyText[1].getText(), p)); setTextViewColorSecondary(big, R.id.notification_material_reply_text_2, p); if (replyText.length > 2 && !TextUtils.isEmpty(replyText[2].getText()) @@ -5866,7 +5858,7 @@ public class Notification implements Parcelable big.setViewVisibility( R.id.notification_material_reply_text_3, View.VISIBLE); big.setTextViewText(R.id.notification_material_reply_text_3, - processTextSpans(replyText[2].getText())); + ensureColorSpanContrast(replyText[2].getText(), p)); setTextViewColorSecondary(big, R.id.notification_material_reply_text_3, p); } } @@ -6280,9 +6272,9 @@ public class Notification implements Parcelable fullLengthColor, notifBackgroundColor); } // Remove full-length color spans and ensure text contrast with the button fill. - title = ensureColorSpanContrast(title, buttonFillColor); + title = ContrastColorUtil.ensureColorSpanContrast(title, buttonFillColor); } - button.setTextViewText(R.id.action0, processTextSpans(title)); + button.setTextViewText(R.id.action0, ensureColorSpanContrast(title, p)); int textColor = ContrastColorUtil.resolvePrimaryColor(mContext, buttonFillColor, mInNightMode); if (tombstone) { @@ -6307,8 +6299,8 @@ public class Notification implements Parcelable button.setIntDimen(R.id.action0, "setMinimumWidth", minWidthDimen); } } else { - button.setTextViewText(R.id.action0, processTextSpans( - processLegacyText(action.title))); + button.setTextViewText(R.id.action0, ensureColorSpanContrast( + action.title, p)); button.setTextColor(R.id.action0, getStandardActionColor(p)); } // CallStyle notifications add action buttons which don't actually exist in mActions, @@ -6385,72 +6377,12 @@ public class Notification implements Parcelable * Ensures contrast on color spans against a background color. * Note that any full-length color spans will be removed instead of being contrasted. * - * @param charSequence the charSequence on which the spans are - * @param background the background color to ensure the contrast against - * @return the contrasted charSequence * @hide */ @VisibleForTesting - public static CharSequence ensureColorSpanContrast(CharSequence charSequence, - int background) { - if (charSequence instanceof Spanned) { - Spanned ss = (Spanned) charSequence; - Object[] spans = ss.getSpans(0, ss.length(), Object.class); - SpannableStringBuilder builder = new SpannableStringBuilder(ss.toString()); - for (Object span : spans) { - Object resultSpan = span; - int spanStart = ss.getSpanStart(span); - int spanEnd = ss.getSpanEnd(span); - boolean fullLength = (spanEnd - spanStart) == charSequence.length(); - if (resultSpan instanceof CharacterStyle) { - resultSpan = ((CharacterStyle) span).getUnderlying(); - } - if (resultSpan instanceof TextAppearanceSpan) { - TextAppearanceSpan originalSpan = (TextAppearanceSpan) resultSpan; - ColorStateList textColor = originalSpan.getTextColor(); - if (textColor != null) { - if (fullLength) { - // Let's drop the color from the span - textColor = null; - } else { - int[] colors = textColor.getColors(); - int[] newColors = new int[colors.length]; - for (int i = 0; i < newColors.length; i++) { - boolean isBgDark = isColorDark(background); - newColors[i] = ContrastColorUtil.ensureLargeTextContrast( - colors[i], background, isBgDark); - } - textColor = new ColorStateList(textColor.getStates().clone(), - newColors); - } - resultSpan = new TextAppearanceSpan( - originalSpan.getFamily(), - originalSpan.getTextStyle(), - originalSpan.getTextSize(), - textColor, - originalSpan.getLinkTextColor()); - } - } else if (resultSpan instanceof ForegroundColorSpan) { - if (fullLength) { - resultSpan = null; - } else { - ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan; - int foregroundColor = originalSpan.getForegroundColor(); - boolean isBgDark = isColorDark(background); - foregroundColor = ContrastColorUtil.ensureLargeTextContrast( - foregroundColor, background, isBgDark); - resultSpan = new ForegroundColorSpan(foregroundColor); - } - } else { - resultSpan = span; - } - if (resultSpan != null) { - builder.setSpan(resultSpan, spanStart, spanEnd, ss.getSpanFlags(span)); - } - } - return builder; - } - return charSequence; + public CharSequence ensureColorSpanContrast(CharSequence charSequence, + StandardTemplateParams p) { + return ContrastColorUtil.ensureColorSpanContrast(charSequence, getBackgroundColor(p)); } /** @@ -7586,8 +7518,8 @@ public class Notification implements Parcelable RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource(), p, null /* result */); if (mSummaryTextSet) { - contentView.setTextViewText(R.id.text, mBuilder.processTextSpans( - mBuilder.processLegacyText(mSummaryText))); + contentView.setTextViewText(R.id.text, mBuilder.ensureColorSpanContrast( + mBuilder.processLegacyText(mSummaryText), p)); mBuilder.setTextViewColorSecondary(contentView, R.id.text, p); contentView.setViewVisibility(R.id.text, View.VISIBLE); } @@ -8207,6 +8139,13 @@ public class Notification implements Parcelable @Override public void addExtras(Bundle extras) { super.addExtras(extras); + addExtras(extras, false, 0); + } + + /** + * @hide + */ + public void addExtras(Bundle extras, boolean ensureContrast, int backgroundColor) { if (mUser != null) { // For legacy usages extras.putCharSequence(EXTRA_SELF_DISPLAY_NAME, mUser.getName()); @@ -8215,11 +8154,13 @@ public class Notification implements Parcelable if (mConversationTitle != null) { extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle); } - if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES, - Message.getBundleArrayForMessages(mMessages)); + if (!mMessages.isEmpty()) { + extras.putParcelableArray(EXTRA_MESSAGES, + getBundleArrayForMessages(mMessages, ensureContrast, backgroundColor)); } - if (!mHistoricMessages.isEmpty()) { extras.putParcelableArray(EXTRA_HISTORIC_MESSAGES, - Message.getBundleArrayForMessages(mHistoricMessages)); + if (!mHistoricMessages.isEmpty()) { + extras.putParcelableArray(EXTRA_HISTORIC_MESSAGES, getBundleArrayForMessages( + mHistoricMessages, ensureContrast, backgroundColor)); } if (mShortcutIcon != null) { extras.putParcelable(EXTRA_CONVERSATION_ICON, mShortcutIcon); @@ -8230,6 +8171,20 @@ public class Notification implements Parcelable extras.putBoolean(EXTRA_IS_GROUP_CONVERSATION, mIsGroupConversation); } + private static Bundle[] getBundleArrayForMessages(List<Message> messages, + boolean ensureContrast, int backgroundColor) { + Bundle[] bundles = new Bundle[messages.size()]; + final int N = messages.size(); + for (int i = 0; i < N; i++) { + final Message m = messages.get(i); + if (ensureContrast) { + m.ensureColorContrast(backgroundColor); + } + bundles[i] = m.toBundle(); + } + return bundles; + } + private void fixTitleAndTextExtras(Bundle extras) { Message m = findLatestIncomingMessage(); CharSequence text = (m == null) ? null : m.mText; @@ -8441,7 +8396,7 @@ public class Notification implements Parcelable mBuilder.setTextViewColorSecondary(contentView, R.id.app_name_divider, p); } - addExtras(mBuilder.mN.extras); + addExtras(mBuilder.mN.extras, true, mBuilder.getBackgroundColor(p)); contentView.setInt(R.id.status_bar_latest_event_content, "setLayoutColor", mBuilder.getSmallIconColor(p)); contentView.setInt(R.id.status_bar_latest_event_content, "setSenderTextColor", @@ -8587,7 +8542,7 @@ public class Notification implements Parcelable static final String KEY_EXTRAS_BUNDLE = "extras"; static final String KEY_REMOTE_INPUT_HISTORY = "remote_input_history"; - private final CharSequence mText; + private CharSequence mText; private final long mTimestamp; @Nullable private final Person mSender; @@ -8696,6 +8651,15 @@ public class Notification implements Parcelable } /** + * Updates TextAppearance spans in the message text so it has sufficient contrast + * against its background. + * @hide + */ + public void ensureColorContrast(int backgroundColor) { + mText = ContrastColorUtil.ensureColorSpanContrast(mText, backgroundColor); + } + + /** * Get the text to be used for this message, or the fallback text if a type and content * Uri have been set */ @@ -8788,15 +8752,6 @@ public class Notification implements Parcelable return bundle; } - static Bundle[] getBundleArrayForMessages(List<Message> messages) { - Bundle[] bundles = new Bundle[messages.size()]; - final int N = messages.size(); - for (int i = 0; i < N; i++) { - bundles[i] = messages.get(i).toBundle(); - } - return bundles; - } - /** * Returns a list of messages read from the given bundle list, e.g. * {@link #EXTRA_MESSAGES} or {@link #EXTRA_HISTORIC_MESSAGES}. @@ -9011,7 +8966,7 @@ public class Notification implements Parcelable if (!TextUtils.isEmpty(str)) { contentView.setViewVisibility(rowIds[i], View.VISIBLE); contentView.setTextViewText(rowIds[i], - mBuilder.processTextSpans(mBuilder.processLegacyText(str))); + mBuilder.ensureColorSpanContrast(mBuilder.processLegacyText(str), p)); mBuilder.setTextViewColorSecondary(contentView, rowIds[i], p); contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0); if (first) { diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 404f94ac77c4..4b8cfd5d3215 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -49,6 +49,12 @@ public class TaskInfo { private static final String TAG = "TaskInfo"; /** + * The value to use when the property has not a specific value. + * @hide + */ + public static final int PROPERTY_VALUE_UNSET = -1; + + /** * The id of the user the task was running as if this is a leaf task. The id of the current * running user of the system otherwise. * @hide @@ -230,6 +236,46 @@ public class TaskInfo { public boolean topActivityEligibleForLetterboxEducation; /** + * Whether the double tap is enabled + * @hide + */ + public boolean isLetterboxDoubleTapEnabled; + + /** + * Whether the update comes from a letterbox double-tap action from the user or not. + * @hide + */ + public boolean isFromLetterboxDoubleTap; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or + * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + * @hide + */ + public int topActivityLetterboxVerticalPosition; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or + * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + * @hide + */ + public int topActivityLetterboxHorizontalPosition; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current width of the letterboxed + * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise + * @hide + */ + public int topActivityLetterboxWidth; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current height of the letterboxed + * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise + * @hide + */ + public int topActivityLetterboxHeight; + + /** * Whether this task is resizable. Unlike {@link #resizeMode} (which is what the top activity * supports), this is what the system actually uses for resizability based on other policy and * developer options. @@ -407,7 +453,8 @@ public class TaskInfo { /** @hide */ public boolean hasCompatUI() { return hasCameraCompatControl() || topActivityInSizeCompat - || topActivityEligibleForLetterboxEducation; + || topActivityEligibleForLetterboxEducation + || isLetterboxDoubleTapEnabled; } /** @@ -456,6 +503,12 @@ public class TaskInfo { && isResizeable == that.isResizeable && supportsMultiWindow == that.supportsMultiWindow && displayAreaFeatureId == that.displayAreaFeatureId + && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap + && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition + && topActivityLetterboxWidth == that.topActivityLetterboxWidth + && topActivityLetterboxHeight == that.topActivityLetterboxHeight + && topActivityLetterboxHorizontalPosition + == that.topActivityLetterboxHorizontalPosition && Objects.equals(positionInParent, that.positionInParent) && Objects.equals(pictureInPictureParams, that.pictureInPictureParams) && Objects.equals(shouldDockBigOverlays, that.shouldDockBigOverlays) @@ -482,8 +535,14 @@ public class TaskInfo { return displayId == that.displayId && taskId == that.taskId && topActivityInSizeCompat == that.topActivityInSizeCompat + && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap && topActivityEligibleForLetterboxEducation == that.topActivityEligibleForLetterboxEducation + && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition + && topActivityLetterboxHorizontalPosition + == that.topActivityLetterboxHorizontalPosition + && topActivityLetterboxWidth == that.topActivityLetterboxWidth + && topActivityLetterboxHeight == that.topActivityLetterboxHeight && cameraCompatControlState == that.cameraCompatControlState // Bounds are important if top activity has compat controls. && (!hasCompatUI() || configuration.windowConfiguration.getBounds() @@ -538,6 +597,12 @@ public class TaskInfo { mTopActivityLocusId = source.readTypedObject(LocusId.CREATOR); displayAreaFeatureId = source.readInt(); cameraCompatControlState = source.readInt(); + isLetterboxDoubleTapEnabled = source.readBoolean(); + isFromLetterboxDoubleTap = source.readBoolean(); + topActivityLetterboxVerticalPosition = source.readInt(); + topActivityLetterboxHorizontalPosition = source.readInt(); + topActivityLetterboxWidth = source.readInt(); + topActivityLetterboxHeight = source.readInt(); } /** @@ -585,6 +650,12 @@ public class TaskInfo { dest.writeTypedObject(mTopActivityLocusId, flags); dest.writeInt(displayAreaFeatureId); dest.writeInt(cameraCompatControlState); + dest.writeBoolean(isLetterboxDoubleTapEnabled); + dest.writeBoolean(isFromLetterboxDoubleTap); + dest.writeInt(topActivityLetterboxVerticalPosition); + dest.writeInt(topActivityLetterboxHorizontalPosition); + dest.writeInt(topActivityLetterboxWidth); + dest.writeInt(topActivityLetterboxHeight); } @Override @@ -620,6 +691,13 @@ public class TaskInfo { + " topActivityInSizeCompat=" + topActivityInSizeCompat + " topActivityEligibleForLetterboxEducation= " + topActivityEligibleForLetterboxEducation + + " topActivityLetterboxed= " + isLetterboxDoubleTapEnabled + + " isFromDoubleTap= " + isFromLetterboxDoubleTap + + " topActivityLetterboxVerticalPosition= " + topActivityLetterboxVerticalPosition + + " topActivityLetterboxHorizontalPosition= " + + topActivityLetterboxHorizontalPosition + + " topActivityLetterboxWidth=" + topActivityLetterboxWidth + + " topActivityLetterboxHeight=" + topActivityLetterboxHeight + " locusId=" + mTopActivityLocusId + " displayAreaFeatureId=" + displayAreaFeatureId + " cameraCompatControlState=" diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index a522cc04eff1..af5c6dd8e977 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -30,6 +30,8 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.UserHandleAware; import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.NotificationManager; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; @@ -41,6 +43,7 @@ import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager; import android.net.MacAddress; +import android.os.Binder; import android.os.Handler; import android.os.OutcomeReceiver; import android.os.ParcelFileDescriptor; @@ -53,6 +56,7 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.CollectionUtils; +import com.android.server.LocalServices; import libcore.io.IoUtils; @@ -989,6 +993,15 @@ public final class CompanionDeviceManager { ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class); throw e.rethrowFromSystemServer(); } + int callingUid = Binder.getCallingUid(); + int callingPid = Binder.getCallingPid(); + ActivityManagerInternal managerInternal = + LocalServices.getService(ActivityManagerInternal.class); + if (managerInternal != null) { + managerInternal + .logFgsApiBegin(ActivityManager.FOREGROUND_SERVICE_API_TYPE_CDM, + callingUid, callingPid); + } } /** @@ -1021,6 +1034,15 @@ public final class CompanionDeviceManager { } catch (RemoteException e) { ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class); } + int callingUid = Binder.getCallingUid(); + int callingPid = Binder.getCallingPid(); + ActivityManagerInternal managerInternal = + LocalServices.getService(ActivityManagerInternal.class); + if (managerInternal != null) { + managerInternal + .logFgsApiEnd(ActivityManager.FOREGROUND_SERVICE_API_TYPE_CDM, + callingUid, callingPid); + } } /** diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index 3a60a695a294..9a34dbe2699c 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -32,6 +32,7 @@ import android.companion.virtual.sensor.IVirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensor; import android.companion.virtual.sensor.VirtualSensorCallback; import android.companion.virtual.sensor.VirtualSensorConfig; +import android.companion.virtual.sensor.VirtualSensorDirectChannelCallback; import android.content.ComponentName; import android.os.Parcel; import android.os.Parcelable; @@ -381,7 +382,8 @@ public final class VirtualDeviceParams implements Parcelable { } /** - * Returns the callback to get notified about changes in the sensor listeners. + * Returns the callback to get notified about changes in the sensor listeners or sensor direct + * channel configuration. * @hide */ @Nullable @@ -533,19 +535,29 @@ public final class VirtualDeviceParams implements Parcelable { private int mAudioRecordingSessionId = AUDIO_SESSION_ID_GENERATE; @NonNull private List<VirtualSensorConfig> mVirtualSensorConfigs = new ArrayList<>(); - @Nullable - private IVirtualSensorCallback mVirtualSensorCallback; + @Nullable private Executor mVirtualSensorCallbackExecutor; + @Nullable private VirtualSensorCallback mVirtualSensorCallback; + @Nullable private Executor mVirtualSensorDirectChannelCallbackExecutor; + @Nullable private VirtualSensorDirectChannelCallback mVirtualSensorDirectChannelCallback; private static class VirtualSensorCallbackDelegate extends IVirtualSensorCallback.Stub { @NonNull private final Executor mExecutor; @NonNull private final VirtualSensorCallback mCallback; + @Nullable + private final Executor mDirectChannelExecutor; + @Nullable + private final VirtualSensorDirectChannelCallback mDirectChannelCallback; VirtualSensorCallbackDelegate(@NonNull @CallbackExecutor Executor executor, - @NonNull VirtualSensorCallback callback) { - mCallback = callback; + @NonNull VirtualSensorCallback callback, + @Nullable @CallbackExecutor Executor directChannelExecutor, + @Nullable VirtualSensorDirectChannelCallback directChannelCallback) { mExecutor = executor; + mCallback = callback; + mDirectChannelExecutor = directChannelExecutor; + mDirectChannelCallback = directChannelCallback; } @Override @@ -562,20 +574,29 @@ public final class VirtualDeviceParams implements Parcelable { @Override public void onDirectChannelCreated(int channelHandle, @NonNull SharedMemory sharedMemory) { - mExecutor.execute( - () -> mCallback.onDirectChannelCreated(channelHandle, sharedMemory)); + if (mDirectChannelCallback != null && mDirectChannelExecutor != null) { + mDirectChannelExecutor.execute( + () -> mDirectChannelCallback.onDirectChannelCreated(channelHandle, + sharedMemory)); + } } @Override public void onDirectChannelDestroyed(int channelHandle) { - mExecutor.execute(() -> mCallback.onDirectChannelDestroyed(channelHandle)); + if (mDirectChannelCallback != null && mDirectChannelExecutor != null) { + mDirectChannelExecutor.execute( + () -> mDirectChannelCallback.onDirectChannelDestroyed(channelHandle)); + } } @Override public void onDirectChannelConfigured(int channelHandle, @NonNull VirtualSensor sensor, int rateLevel, int reportToken) { - mExecutor.execute(() -> mCallback.onDirectChannelConfigured( - channelHandle, sensor, rateLevel, reportToken)); + if (mDirectChannelCallback != null && mDirectChannelExecutor != null) { + mDirectChannelExecutor.execute( + () -> mDirectChannelCallback.onDirectChannelConfigured( + channelHandle, sensor, rateLevel, reportToken)); + } } } @@ -783,20 +804,37 @@ public final class VirtualDeviceParams implements Parcelable { } /** - * Sets the callback to get notified about changes in the sensor listeners. + * Sets the callback to get notified about changes in the sensor configuration. * * @param executor The executor where the callback is executed on. * @param callback The callback to get notified when the state of the sensor - * listeners has changed, see {@link VirtualSensorCallback} + * configuration has changed, see {@link VirtualSensorCallback} */ @SuppressLint("MissingGetterMatchingBuilder") @NonNull public Builder setVirtualSensorCallback( @NonNull @CallbackExecutor Executor executor, @NonNull VirtualSensorCallback callback) { - mVirtualSensorCallback = new VirtualSensorCallbackDelegate( - Objects.requireNonNull(executor), - Objects.requireNonNull(callback)); + mVirtualSensorCallbackExecutor = Objects.requireNonNull(executor); + mVirtualSensorCallback = Objects.requireNonNull(callback); + return this; + } + + /** + * Sets the callback to get notified about changes in + * {@link android.hardware.SensorDirectChannel} configuration. + * + * @param executor The executor where the callback is executed on. + * @param callback The callback to get notified when the state of the sensor + * configuration has changed, see {@link VirtualSensorDirectChannelCallback} + */ + @SuppressLint("MissingGetterMatchingBuilder") + @NonNull + public Builder setVirtualSensorDirectChannelCallback( + @NonNull @CallbackExecutor Executor executor, + @NonNull VirtualSensorDirectChannelCallback callback) { + mVirtualSensorDirectChannelCallbackExecutor = Objects.requireNonNull(executor); + mVirtualSensorDirectChannelCallback = Objects.requireNonNull(callback); return this; } @@ -857,6 +895,7 @@ public final class VirtualDeviceParams implements Parcelable { */ @NonNull public VirtualDeviceParams build() { + VirtualSensorCallbackDelegate virtualSensorCallbackDelegate = null; if (!mVirtualSensorConfigs.isEmpty()) { if (mDevicePolicies.get(POLICY_TYPE_SENSORS, DEVICE_POLICY_DEFAULT) != DEVICE_POLICY_CUSTOM) { @@ -868,6 +907,22 @@ public final class VirtualDeviceParams implements Parcelable { throw new IllegalArgumentException( "VirtualSensorCallback is required for creating virtual sensors."); } + + for (int i = 0; i < mVirtualSensorConfigs.size(); ++i) { + if (mVirtualSensorConfigs.get(i).getDirectChannelTypesSupported() > 0) { + if (mVirtualSensorDirectChannelCallback == null) { + throw new IllegalArgumentException( + "VirtualSensorDirectChannelCallback is required for creating " + + "virtual sensors that support direct channel."); + } + break; + } + } + virtualSensorCallbackDelegate = new VirtualSensorCallbackDelegate( + mVirtualSensorCallbackExecutor, + mVirtualSensorCallback, + mVirtualSensorDirectChannelCallbackExecutor, + mVirtualSensorDirectChannelCallback); } if ((mAudioPlaybackSessionId != AUDIO_SESSION_ID_GENERATE @@ -901,7 +956,7 @@ public final class VirtualDeviceParams implements Parcelable { mName, mDevicePolicies, mVirtualSensorConfigs, - mVirtualSensorCallback, + virtualSensorCallbackDelegate, mAudioPlaybackSessionId, mAudioRecordingSessionId); } diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java b/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java index f7af283a749b..e6bd6daa060f 100644 --- a/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java +++ b/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java @@ -17,18 +17,14 @@ package android.companion.virtual.sensor; -import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.hardware.Sensor; -import android.hardware.SensorDirectChannel; -import android.os.MemoryFile; -import android.os.SharedMemory; import java.time.Duration; /** - * Interface for notifying the sensor owner about whether and how sensor events should be injected. + * Interface for notifying the virtual device owner about whether and how sensor events should be + * injected. * * <p>This callback can be used for controlling the sensor event injection - e.g. if the sensor is * not enabled, then no events should be injected. Similarly, the rate and delay of the injected @@ -45,6 +41,7 @@ public interface VirtualSensorCallback { * Called when the requested sensor event injection parameters have changed. * * <p>This is effectively called when the registered listeners to a virtual sensor have changed. + * The events for the corresponding sensor should be sent via {@link VirtualSensor#sendEvent}. * * @param sensor The sensor whose requested injection parameters have changed. * @param enabled Whether the sensor is enabled. True if any listeners are currently registered, @@ -55,74 +52,4 @@ public interface VirtualSensorCallback { */ void onConfigurationChanged(@NonNull VirtualSensor sensor, boolean enabled, @NonNull Duration samplingPeriod, @NonNull Duration batchReportLatency); - - /** - * Called when a {@link android.hardware.SensorDirectChannel} is created. - * - * <p>The {@link android.hardware.SensorManager} instance used to create the direct channel must - * be associated with the virtual device. - * - * <p>A typical order of callback invocations is: - * <ul> - * <li>{@code onDirectChannelCreated} - the channel handle and the associated shared memory - * should be stored by the virtual device</li> - * <li>{@code onDirectChannelConfigured} with a positive {@code rateLevel} - the virtual - * device should start writing to the shared memory for the associated channel with the - * requested parameters.</li> - * <li>{@code onDirectChannelConfigured} with a {@code rateLevel = RATE_STOP} - the virtual - * device should stop writing to the shared memory for the associated channel.</li> - * <li>{@code onDirectChannelDestroyed} - the shared memory associated with the channel - * handle should be closed.</li> - * </ul> - * - * @param channelHandle Identifier of the newly created channel. - * @param sharedMemory writable shared memory region. - * - * @see android.hardware.SensorManager#createDirectChannel(MemoryFile) - * @see #onDirectChannelConfigured - * @see #onDirectChannelDestroyed - */ - default void onDirectChannelCreated(@IntRange(from = 1) int channelHandle, - @NonNull SharedMemory sharedMemory) {} - - /** - * Called when a {@link android.hardware.SensorDirectChannel} is destroyed. - * - * <p>The virtual device must perform any clean-up and close the shared memory that was - * received with the {@link #onDirectChannelCreated} callback and the corresponding - * {@code channelHandle}. - * - * @param channelHandle Identifier of the channel that was destroyed. - * - * @see SensorDirectChannel#close() - */ - default void onDirectChannelDestroyed(@IntRange(from = 1) int channelHandle) {} - - /** - * Called when a {@link android.hardware.SensorDirectChannel} is configured. - * - * <p>Sensor events for the corresponding sensor should be written at the indicated rate to the - * shared memory region that was received with the {@link #onDirectChannelCreated} callback and - * the corresponding {@code channelHandle}. The events should be written in the correct format - * and with the provided {@code reportToken} until the channel is reconfigured with - * {@link SensorDirectChannel#RATE_STOP}. - * - * <p>The sensor must support direct channel in order for this callback to be invoked. Only - * {@link MemoryFile} sensor direct channels are supported for virtual sensors. - * - * @param channelHandle Identifier of the channel that was configured. - * @param sensor The sensor, for which the channel was configured. - * @param rateLevel The rate level used to configure the direct sensor channel. - * @param reportToken A positive sensor report token, used to differentiate between events from - * different sensors within the same channel. - * - * @see VirtualSensorConfig.Builder#setHighestDirectReportRateLevel(int) - * @see VirtualSensorConfig.Builder#setDirectChannelTypesSupported(int) - * @see android.hardware.SensorManager#createDirectChannel(MemoryFile) - * @see #onDirectChannelCreated - * @see SensorDirectChannel#configure(Sensor, int) - */ - default void onDirectChannelConfigured(@IntRange(from = 1) int channelHandle, - @NonNull VirtualSensor sensor, @SensorDirectChannel.RateLevel int rateLevel, - @IntRange(from = 1) int reportToken) {} } diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java index 401e754abca6..ef55ca97585d 100644 --- a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java +++ b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java @@ -50,14 +50,25 @@ public final class VirtualSensorConfig implements Parcelable { private final String mName; @Nullable private final String mVendor; + private final float mMaximumRange; + private final float mResolution; + private final float mPower; + private final int mMinDelay; + private final int mMaxDelay; private final int mFlags; private VirtualSensorConfig(int type, @NonNull String name, @Nullable String vendor, + float maximumRange, float resolution, float power, int minDelay, int maxDelay, int flags) { mType = type; mName = name; mVendor = vendor; + mMaximumRange = maximumRange; + mResolution = resolution; + mPower = power; + mMinDelay = minDelay; + mMaxDelay = maxDelay; mFlags = flags; } @@ -65,6 +76,11 @@ public final class VirtualSensorConfig implements Parcelable { mType = parcel.readInt(); mName = parcel.readString8(); mVendor = parcel.readString8(); + mMaximumRange = parcel.readFloat(); + mResolution = parcel.readFloat(); + mPower = parcel.readFloat(); + mMinDelay = parcel.readInt(); + mMaxDelay = parcel.readInt(); mFlags = parcel.readInt(); } @@ -78,6 +94,11 @@ public final class VirtualSensorConfig implements Parcelable { parcel.writeInt(mType); parcel.writeString8(mName); parcel.writeString8(mVendor); + parcel.writeFloat(mMaximumRange); + parcel.writeFloat(mResolution); + parcel.writeFloat(mPower); + parcel.writeInt(mMinDelay); + parcel.writeInt(mMaxDelay); parcel.writeInt(mFlags); } @@ -109,6 +130,47 @@ public final class VirtualSensorConfig implements Parcelable { } /** + * Returns maximum range of the sensor in the sensor's unit. + * @see Sensor#getMaximumRange + */ + public float getMaximumRange() { + return mMaximumRange; + } + + /** + * Returns The resolution of the sensor in the sensor's unit. + * @see Sensor#getResolution + */ + public float getResolution() { + return mResolution; + } + + /** + * Returns The power in mA used by this sensor while in use. + * @see Sensor#getPower + */ + public float getPower() { + return mPower; + } + + /** + * Returns The minimum delay allowed between two events in microseconds, or zero depending on + * the sensor type. + * @see Sensor#getMinDelay + */ + public int getMinDelay() { + return mMinDelay; + } + + /** + * Returns The maximum delay between two sensor events in microseconds. + * @see Sensor#getMaxDelay + */ + public int getMaxDelay() { + return mMaxDelay; + } + + /** * Returns the highest supported direct report mode rate level of the sensor. * * @see Sensor#getHighestDirectReportRateLevel() @@ -157,6 +219,11 @@ public final class VirtualSensorConfig implements Parcelable { private final String mName; @Nullable private String mVendor; + private float mMaximumRange; + private float mResolution; + private float mPower; + private int mMinDelay; + private int mMaxDelay; private int mFlags; @SensorDirectChannel.RateLevel int mHighestDirectReportRateLevel; @@ -193,7 +260,8 @@ public final class VirtualSensorConfig implements Parcelable { throw new IllegalArgumentException("Highest direct report rate level is " + "required for sensors with direct channel support."); } - return new VirtualSensorConfig(mType, mName, mVendor, mFlags); + return new VirtualSensorConfig(mType, mName, mVendor, mMaximumRange, mResolution, + mPower, mMinDelay, mMaxDelay, mFlags); } /** @@ -206,6 +274,56 @@ public final class VirtualSensorConfig implements Parcelable { } /** + * Sets the maximum range of the sensor in the sensor's unit. + * @see Sensor#getMaximumRange + */ + @NonNull + public VirtualSensorConfig.Builder setMaximumRange(float maximumRange) { + mMaximumRange = maximumRange; + return this; + } + + /** + * Sets the resolution of the sensor in the sensor's unit. + * @see Sensor#getResolution + */ + @NonNull + public VirtualSensorConfig.Builder setResolution(float resolution) { + mResolution = resolution; + return this; + } + + /** + * Sets the power in mA used by this sensor while in use. + * @see Sensor#getPower + */ + @NonNull + public VirtualSensorConfig.Builder setPower(float power) { + mPower = power; + return this; + } + + /** + * Sets the minimum delay allowed between two events in microseconds. + * @see Sensor#getMinDelay + */ + @NonNull + public VirtualSensorConfig.Builder setMinDelay(int minDelay) { + mMinDelay = minDelay; + return this; + } + + /** + * Sets the maximum delay between two sensor events in microseconds. + * @see Sensor#getMaxDelay + */ + @NonNull + public VirtualSensorConfig.Builder setMaxDelay(int maxDelay) { + mMaxDelay = maxDelay; + return this; + } + + /** * Sets the highest supported rate level for direct sensor report. * * @see VirtualSensorConfig#getHighestDirectReportRateLevel() diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java new file mode 100644 index 000000000000..d352f94ffd76 --- /dev/null +++ b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.companion.virtual.sensor; + + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.SystemApi; +import android.hardware.Sensor; +import android.hardware.SensorDirectChannel; +import android.os.MemoryFile; +import android.os.SharedMemory; + +/** + * Interface for notifying the virtual device owner about any {@link SensorDirectChannel} events. + * + * <p>This callback can be used for controlling the sensor event injection to direct channels. A + * typical order of callback invocations is: + * <ul> + * <li>{@code onDirectChannelCreated} - the channel handle and the associated shared memory + * should be stored by the virtual device</li> + * <li>{@code onDirectChannelConfigured} with a positive {@code rateLevel} - the virtual + * device should start writing to the shared memory for the associated channel with the + * requested parameters.</li> + * <li>{@code onDirectChannelConfigured} with a {@code rateLevel = RATE_STOP} - the virtual + * device should stop writing to the shared memory for the associated channel.</li> + * <li>{@code onDirectChannelDestroyed} - the shared memory associated with the channel + * handle should be closed.</li> + * </ul> + * + * <p>The callback is tied to the VirtualDevice's lifetime as the virtual sensors are created when + * the device is created and destroyed when the device is destroyed. + * + * @hide + */ +@SystemApi +public interface VirtualSensorDirectChannelCallback { + /** + * Called when a {@link android.hardware.SensorDirectChannel} is created. + * + * <p>The {@link android.hardware.SensorManager} instance used to create the direct channel must + * be associated with the virtual device. + * + * @param channelHandle Identifier of the newly created channel. + * @param sharedMemory writable shared memory region. + * + * @see android.hardware.SensorManager#createDirectChannel(MemoryFile) + * @see #onDirectChannelConfigured + * @see #onDirectChannelDestroyed + */ + void onDirectChannelCreated(@IntRange(from = 1) int channelHandle, + @NonNull SharedMemory sharedMemory); + + /** + * Called when a {@link android.hardware.SensorDirectChannel} is destroyed. + * + * <p>The virtual device must perform any clean-up and close the shared memory that was + * received with the {@link #onDirectChannelCreated} callback and the corresponding + * {@code channelHandle}. + * + * @param channelHandle Identifier of the channel that was destroyed. + * + * @see SensorDirectChannel#close() + */ + void onDirectChannelDestroyed(@IntRange(from = 1) int channelHandle); + + /** + * Called when a {@link android.hardware.SensorDirectChannel} is configured. + * + * <p>Sensor events for the corresponding sensor should be written at the indicated rate to the + * shared memory region that was received with the {@link #onDirectChannelCreated} callback and + * the corresponding {@code channelHandle}. The events should be written in the correct format + * and with the provided {@code reportToken} until the channel is reconfigured with + * {@link SensorDirectChannel#RATE_STOP}. + * + * <p>The sensor must support direct channel in order for this callback to be invoked. Only + * {@link MemoryFile} sensor direct channels are supported for virtual sensors. + * + * @param channelHandle Identifier of the channel that was configured. + * @param sensor The sensor, for which the channel was configured. + * @param rateLevel The rate level used to configure the direct sensor channel. + * @param reportToken A positive sensor report token, used to differentiate between events from + * different sensors within the same channel. + * + * @see VirtualSensorConfig.Builder#setHighestDirectReportRateLevel(int) + * @see VirtualSensorConfig.Builder#setDirectChannelTypesSupported(int) + * @see android.hardware.SensorManager#createDirectChannel(MemoryFile) + * @see #onDirectChannelCreated + * @see SensorDirectChannel#configure(Sensor, int) + */ + void onDirectChannelConfigured(@IntRange(from = 1) int channelHandle, + @NonNull VirtualSensor sensor, @SensorDirectChannel.RateLevel int rateLevel, + @IntRange(from = 1) int reportToken); +} diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java new file mode 100644 index 000000000000..6aed96ff593e --- /dev/null +++ b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.companion.virtual.sensor; + + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.SystemApi; +import android.hardware.SensorDirectChannel; +import android.os.SharedMemory; +import android.system.ErrnoException; +import android.util.Log; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Helper class for writing sensor events to the relevant configured direct channels. + * + * <p>The virtual device owner can forward the {@link VirtualSensorDirectChannelCallback} + * invocations to a {@link VirtualSensorDirectChannelWriter} instance and use that writer to + * write the events from the relevant sensors directly to the shared memory regions of the + * corresponding {@link SensorDirectChannel} instances. + * + * @see android.hardware.SensorDirectChannel#configure + * @see VirtualSensorDirectChannelCallback + * + * @hide + */ +@SystemApi +public final class VirtualSensorDirectChannelWriter implements AutoCloseable { + + private static final String TAG = "VirtualSensorWriter"; + + private static final long UINT32_MAX = 4294967295L; + + // Mapping from channel handle to channel shared memory region. + @GuardedBy("mChannelsLock") + private final SparseArray<SharedMemoryWrapper> mChannels = new SparseArray<>(); + private final Object mChannelsLock = new Object(); + + // Mapping from sensor handle to channel handle to direct sensor configuration. + @GuardedBy("mChannelsLock") + private final SparseArray<SparseArray<DirectChannelConfiguration>> mConfiguredChannels = + new SparseArray<>(); + + @Override + public void close() { + synchronized (mChannelsLock) { + for (int i = 0; i < mChannels.size(); ++i) { + mChannels.valueAt(i).close(); + } + mChannels.clear(); + mConfiguredChannels.clear(); + } + } + + /** + * Adds a sensor direct channel handle and the relevant shared memory region. + * + * @throws ErrnoException if the mapping of the shared memory region failed. + * + * @see VirtualSensorDirectChannelCallback#onDirectChannelCreated + */ + public void addChannel(@IntRange(from = 1) int channelHandle, + @NonNull SharedMemory sharedMemory) throws ErrnoException { + synchronized (mChannelsLock) { + if (mChannels.contains(channelHandle)) { + Log.w(TAG, "Channel with handle " + channelHandle + " already added."); + } else { + mChannels.put(channelHandle, + new SharedMemoryWrapper(Objects.requireNonNull(sharedMemory))); + } + } + } + + /** + * Removes a sensor direct channel indicated by the handle and closes the relevant shared memory + * region. + * + * @see VirtualSensorDirectChannelCallback#onDirectChannelDestroyed + */ + public void removeChannel(@IntRange(from = 1) int channelHandle) { + synchronized (mChannelsLock) { + SharedMemoryWrapper sharedMemoryWrapper = mChannels.removeReturnOld(channelHandle); + if (sharedMemoryWrapper != null) { + sharedMemoryWrapper.close(); + } + for (int i = 0; i < mConfiguredChannels.size(); ++i) { + mConfiguredChannels.valueAt(i).remove(channelHandle); + } + } + } + + /** + * Configures a sensor direct channel indicated by the handle and prepares it for sensor event + * writes for the given sensor. + * + * @return Whether the configuration was successful. + * + * @see VirtualSensorDirectChannelCallback#onDirectChannelConfigured + */ + public boolean configureChannel(@IntRange(from = 1) int channelHandle, + @NonNull VirtualSensor sensor, @SensorDirectChannel.RateLevel int rateLevel, + @IntRange(from = 1) int reportToken) { + synchronized (mChannelsLock) { + SparseArray<DirectChannelConfiguration> configs = mConfiguredChannels.get( + Objects.requireNonNull(sensor).getHandle()); + if (rateLevel == SensorDirectChannel.RATE_STOP) { + if (configs == null || configs.removeReturnOld(channelHandle) == null) { + Log.w(TAG, "Channel configuration failed - channel with handle " + + channelHandle + " not found"); + return false; + } + return true; + } + + if (configs == null) { + configs = new SparseArray<>(); + mConfiguredChannels.put(sensor.getHandle(), configs); + } + + SharedMemoryWrapper sharedMemoryWrapper = mChannels.get(channelHandle); + if (sharedMemoryWrapper == null) { + Log.w(TAG, "Channel configuration failed - channel with handle " + + channelHandle + " not found"); + return false; + } + configs.put(channelHandle, new DirectChannelConfiguration( + reportToken, sensor.getType(), sharedMemoryWrapper)); + return true; + } + } + + /** + * Writes a sensor event for the given sensor to all configured sensor direct channels for that + * sensor. + * + * @return Whether the write was successful. + * + */ + public boolean writeSensorEvent(@NonNull VirtualSensor sensor, + @NonNull VirtualSensorEvent event) { + Objects.requireNonNull(event); + synchronized (mChannelsLock) { + SparseArray<DirectChannelConfiguration> configs = mConfiguredChannels.get( + Objects.requireNonNull(sensor).getHandle()); + if (configs == null || configs.size() == 0) { + Log.w(TAG, "Sensor event write failed - no direct sensor channels configured for " + + "sensor " + sensor.getName()); + return false; + } + + for (int i = 0; i < configs.size(); ++i) { + configs.valueAt(i).write(Objects.requireNonNull(event)); + } + } + return true; + } + + private static final class SharedMemoryWrapper { + + private static final int SENSOR_EVENT_SIZE = 104; + + // The limit of number of values for a single sensor event. + private static final int MAXIMUM_NUMBER_OF_SENSOR_VALUES = 16; + + @GuardedBy("mWriteLock") + private final SharedMemory mSharedMemory; + @GuardedBy("mWriteLock") + private int mWriteOffset = 0; + @GuardedBy("mWriteLock") + private final ByteBuffer mEventBuffer = ByteBuffer.allocate(SENSOR_EVENT_SIZE); + @GuardedBy("mWriteLock") + private final ByteBuffer mMemoryMapping; + private final Object mWriteLock = new Object(); + + SharedMemoryWrapper(SharedMemory sharedMemory) throws ErrnoException { + mSharedMemory = sharedMemory; + mMemoryMapping = mSharedMemory.mapReadWrite(); + mEventBuffer.order(ByteOrder.nativeOrder()); + } + + void close() { + synchronized (mWriteLock) { + mSharedMemory.close(); + } + } + + void write(int reportToken, int sensorType, long eventCounter, VirtualSensorEvent event) { + synchronized (mWriteLock) { + mEventBuffer.position(0); + mEventBuffer.putInt(SENSOR_EVENT_SIZE); + mEventBuffer.putInt(reportToken); + mEventBuffer.putInt(sensorType); + mEventBuffer.putInt((int) (eventCounter & UINT32_MAX)); + mEventBuffer.putLong(event.getTimestampNanos()); + + for (int i = 0; i < MAXIMUM_NUMBER_OF_SENSOR_VALUES; ++i) { + if (i < event.getValues().length) { + mEventBuffer.putFloat(event.getValues()[i]); + } else { + mEventBuffer.putFloat(0f); + } + } + mEventBuffer.putInt(0); + + mMemoryMapping.position(mWriteOffset); + mMemoryMapping.put(mEventBuffer.array(), 0, SENSOR_EVENT_SIZE); + + mWriteOffset += SENSOR_EVENT_SIZE; + if (mWriteOffset + SENSOR_EVENT_SIZE >= mSharedMemory.getSize()) { + mWriteOffset = 0; + } + } + } + } + + private static final class DirectChannelConfiguration { + private final int mReportToken; + private final int mSensorType; + private final AtomicLong mEventCounter; + private final SharedMemoryWrapper mSharedMemoryWrapper; + + DirectChannelConfiguration(int reportToken, int sensorType, + SharedMemoryWrapper sharedMemoryWrapper) { + mReportToken = reportToken; + mSensorType = sensorType; + mEventCounter = new AtomicLong(1); + mSharedMemoryWrapper = sharedMemoryWrapper; + } + + void write(VirtualSensorEvent event) { + long currentCounter = mEventCounter.getAcquire(); + mSharedMemoryWrapper.write(mReportToken, mSensorType, currentCounter++, event); + if (currentCounter == UINT32_MAX + 1) { + currentCounter = 1; + } + mEventCounter.setRelease(currentCounter); + } + } +} diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index d2dbd64ccd7a..31c02b886686 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -302,10 +302,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall @Override public String getType(AttributionSource attributionSource, Uri uri) { - // getCallingPackage() isn't available in getType(), as the javadoc states. uri = validateIncomingUri(uri); uri = maybeGetUriWithoutUserId(uri); traceBegin(TRACE_TAG_DATABASE, "getType: ", uri.getAuthority()); + final AttributionSource original = setCallingAttributionSource( + attributionSource); try { if (checkGetTypePermission(attributionSource, uri) == PermissionChecker.PERMISSION_GRANTED) { @@ -346,6 +347,7 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } finally { + setCallingAttributionSource(original); Trace.traceEnd(TRACE_TAG_DATABASE); } } @@ -405,16 +407,20 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall @Override public void getTypeAnonymousAsync(Uri uri, RemoteCallback callback) { + // getCallingPackage() isn't available in getTypeAnonymous(), as the javadoc states. uri = validateIncomingUri(uri); uri = maybeGetUriWithoutUserId(uri); + traceBegin(TRACE_TAG_DATABASE, "getTypeAnonymous: ", uri.getAuthority()); final Bundle result = new Bundle(); try { result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getTypeAnonymous(uri)); } catch (Exception e) { result.putParcelable(ContentResolver.REMOTE_CALLBACK_ERROR, new ParcelableException(e)); + } finally { + callback.sendResult(result); + Trace.traceEnd(TRACE_TAG_DATABASE); } - callback.sendResult(result); } @Override @@ -629,16 +635,19 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall } @Override - public String[] getStreamTypes(Uri uri, String mimeTypeFilter) { - // getCallingPackage() isn't available in getType(), as the javadoc states. + public String[] getStreamTypes(AttributionSource attributionSource, + Uri uri, String mimeTypeFilter) { uri = validateIncomingUri(uri); uri = maybeGetUriWithoutUserId(uri); traceBegin(TRACE_TAG_DATABASE, "getStreamTypes: ", uri.getAuthority()); + final AttributionSource original = setCallingAttributionSource( + attributionSource); try { return mInterface.getStreamTypes(uri, mimeTypeFilter); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } finally { + setCallingAttributionSource(original); Trace.traceEnd(TRACE_TAG_DATABASE); } } @@ -1114,7 +1123,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * currently processing a request. * <p> * This will always return {@code null} when processing - * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests. + * {@link #getTypeAnonymous(Uri)} requests + * + * For {@link #getType(Uri)} requests, this will be only available for cases, where + * the caller can be identified. See {@link #getTypeAnonymous(Uri)} * * @see Binder#getCallingUid() * @see Context#grantUriPermission(String, Uri, int) @@ -1154,7 +1166,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * a request of the request is for the default attribution. * <p> * This will always return {@code null} when processing - * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests. + * {@link #getTypeAnonymous(Uri)} requests + * + * For {@link #getType(Uri)} requests, this will be only available for cases, where + * the caller can be identified. See {@link #getTypeAnonymous(Uri)} * * @see #getCallingPackage */ @@ -1181,7 +1196,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * {@code null} if not currently processing a request. * <p> * This will always return {@code null} when processing - * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests. + * {@link #getTypeAnonymous(Uri)} requests + * + * For {@link #getType(Uri)} requests, this will be only available for cases, where + * the caller can be identified. See {@link #getTypeAnonymous(Uri)} * * @see Binder#getCallingUid() * @see Context#grantUriPermission(String, Uri, int) diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index cc3c01241c66..6b6ac03db46f 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -217,7 +217,7 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable { beforeRemote(); try { - return mContentProvider.getType(url); + return mContentProvider.getType(mAttributionSource, url); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); @@ -237,7 +237,7 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable { beforeRemote(); try { - return mContentProvider.getStreamTypes(url, mimeTypeFilter); + return mContentProvider.getStreamTypes(mAttributionSource, url, mimeTypeFilter); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index 4ba3ff4fe3d3..fda3e3782d88 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -315,9 +315,11 @@ abstract public class ContentProviderNative extends Binder implements IContentPr case GET_STREAM_TYPES_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); + AttributionSource attributionSource = AttributionSource.CREATOR + .createFromParcel(data); Uri url = Uri.CREATOR.createFromParcel(data); String mimeTypeFilter = data.readString(); - String[] types = getStreamTypes(url, mimeTypeFilter); + String[] types = getStreamTypes(attributionSource, url, mimeTypeFilter); reply.writeNoException(); reply.writeStringArray(types); @@ -769,12 +771,14 @@ final class ContentProviderProxy implements IContentProvider } @Override - public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException + public String[] getStreamTypes(AttributionSource attributionSource, + Uri url, String mimeTypeFilter) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); + attributionSource.writeToParcel(data, 0); url.writeToParcel(data, 0); data.writeString(mimeTypeFilter); diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 456d21897711..feca7a022934 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -1069,7 +1069,7 @@ public abstract class ContentResolver implements ContentInterface { } try { - return provider.getStreamTypes(url, mimeTypeFilter); + return provider.getStreamTypes(mContext.getAttributionSource(), url, mimeTypeFilter); } catch (RemoteException e) { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index fc7532303ab1..3b2ea785988e 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -7873,4 +7873,15 @@ public abstract class Context { public boolean isConfigurationContext() { throw new RuntimeException("Not implemented. Must override in a subclass."); } + + /** + * Closes temporary system dialogs. Some examples of temporary system dialogs are the + * notification window-shade and the recent tasks dialog. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS) + public void closeSystemDialogs() { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } } diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 21de5cf1511a..4327c7acf0f0 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -1484,4 +1484,15 @@ public class ContextWrapper extends Context { // Do nothing if the callback hasn't been registered to Application Context by // super.unregisterComponentCallbacks() for Application that is targeting prior to T. } + + /** + * Closes temporary system dialogs. Some examples of temporary system dialogs are the + * notification window-shade and the recent tasks dialog. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS) + public void closeSystemDialogs() { + mBase.closeSystemDialogs(); + } } diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java index eb80148250b9..ef8d0f9e18c8 100644 --- a/core/java/android/content/IContentProvider.java +++ b/core/java/android/content/IContentProvider.java @@ -182,8 +182,19 @@ public interface IContentProvider extends IInterface { public boolean refresh(@NonNull AttributionSource attributionSource, Uri url, @Nullable Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException; + /** + * @deprecated -- use getStreamTypes with AttributionSource + */ + @Deprecated + default String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException { + return getStreamTypes(new AttributionSource(Binder.getCallingUid(), + AppGlobals.getPackageManager().getPackagesForUid(Binder.getCallingUid())[0], + null), url, mimeTypeFilter); + } + // Data interchange. - public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException; + String[] getStreamTypes(AttributionSource attributionSource, + Uri url, String mimeTypeFilter) throws RemoteException; public AssetFileDescriptor openTypedAssetFile(@NonNull AttributionSource attributionSource, Uri url, String mimeType, Bundle opts, ICancellationSignal signal) diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index eb14cc4802ad..8aa9b739acf9 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -1087,6 +1087,20 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { 254631730L; // buganizer id /** + * This change id enables compat policy that ignores app requested orientation in + * response to an app calling {@link android.app.Activity#setRequestedOrientation} more + * than twice in one second if an activity is not letterboxed for fixed orientation. + * See com.android.server.wm.LetterboxUiController#shouldIgnoreRequestedOrientation + * for details. + * @hide + */ + @ChangeId + @Overridable + @Disabled + public static final long OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED = + 273509367L; // buganizer id + + /** * This change id forces the packages it is applied to never have Display API sandboxing * applied for a letterbox or SCM activity. The Display APIs will continue to provide * DisplayArea bounds. diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 410994d61c2e..1ba84c5aae19 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -353,12 +353,13 @@ interface IPackageManager { */ @UnsupportedAppUsage void setComponentEnabledSetting(in ComponentName componentName, - in int newState, in int flags, int userId); + in int newState, in int flags, int userId, String callingPackage); /** * As per {@link android.content.pm.PackageManager#setComponentEnabledSettings}. */ - void setComponentEnabledSettings(in List<ComponentEnabledSetting> settings, int userId); + void setComponentEnabledSettings(in List<ComponentEnabledSetting> settings, int userId, + String callingPackage); /** * As per {@link android.content.pm.PackageManager#getComponentEnabledSetting}. diff --git a/core/java/android/content/pm/InstallSourceInfo.java b/core/java/android/content/pm/InstallSourceInfo.java index 67123e87a265..006d7cdcb2b6 100644 --- a/core/java/android/content/pm/InstallSourceInfo.java +++ b/core/java/android/content/pm/InstallSourceInfo.java @@ -95,8 +95,8 @@ public final class InstallSourceInfo implements Parcelable { * remains unchanged. It continues to identify the actual package that performed the install * or update. * <p> - * Null may be returned if the app was not installed by a package (e.g. a system app or an app - * installed via adb) or if the initiating package has itself been uninstalled. + * Null may be returned if the app was not installed by a package (e.g. a system app) or if the + * initiating package has itself been uninstalled. */ @Nullable public String getInitiatingPackageName() { diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index dfc7b4649770..ef3842aeb348 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -1453,6 +1453,16 @@ public final class AssetManager implements AutoCloseable { } /** + * @hide + */ + Configuration[] getSizeAndUiModeConfigurations() { + synchronized (this) { + ensureValidLocked(); + return nativeGetSizeAndUiModeConfigurations(mObject); + } + } + + /** * Change the configuration used when retrieving resources. Not for use by * applications. * @hide @@ -1604,6 +1614,7 @@ public final class AssetManager implements AutoCloseable { private static native @Nullable String nativeGetResourceEntryName(long ptr, @AnyRes int resid); private static native @Nullable String[] nativeGetLocales(long ptr, boolean excludeSystem); private static native @Nullable Configuration[] nativeGetSizeConfigurations(long ptr); + private static native @Nullable Configuration[] nativeGetSizeAndUiModeConfigurations(long ptr); private static native void nativeSetResourceResolutionLoggingEnabled(long ptr, boolean enabled); private static native @Nullable String nativeGetLastResourceResolution(long ptr); diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index d6934bca46b7..885060f19efa 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -2232,6 +2232,11 @@ public class Resources { return mResourcesImpl.getSizeConfigurations(); } + /** @hide */ + public Configuration[] getSizeAndUiModeConfigurations() { + return mResourcesImpl.getSizeAndUiModeConfigurations(); + } + /** * Return the compatibility mode information for the application. * The returned object should be treated as read-only. diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 21708864d73f..3a2863e5636d 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -207,6 +207,10 @@ public class ResourcesImpl { return mAssets.getSizeConfigurations(); } + Configuration[] getSizeAndUiModeConfigurations() { + return mAssets.getSizeAndUiModeConfigurations(); + } + CompatibilityInfo getCompatibilityInfo() { return mDisplayAdjustments.getCompatibilityInfo(); } diff --git a/core/java/android/credentials/ui/RequestInfo.java b/core/java/android/credentials/ui/RequestInfo.java index 49ae9e97b840..09d2db89a043 100644 --- a/core/java/android/credentials/ui/RequestInfo.java +++ b/core/java/android/credentials/ui/RequestInfo.java @@ -74,13 +74,30 @@ public final class RequestInfo implements Parcelable { @NonNull private final String mAppPackageName; + private final boolean mHasPermissionToOverrideDefault; + /** Creates new {@code RequestInfo} for a create-credential flow. */ @NonNull public static RequestInfo newCreateRequestInfo( @NonNull IBinder token, @NonNull CreateCredentialRequest createCredentialRequest, @NonNull String appPackageName) { return new RequestInfo( - token, TYPE_CREATE, appPackageName, createCredentialRequest, null); + token, TYPE_CREATE, appPackageName, createCredentialRequest, null, + /*hasPermissionToOverrideDefault=*/ false); + } + + /** + * Creates new {@code RequestInfo} for a create-credential flow. + * + * @hide + */ + @NonNull + public static RequestInfo newCreateRequestInfo( + @NonNull IBinder token, @NonNull CreateCredentialRequest createCredentialRequest, + @NonNull String appPackageName, boolean hasPermissionToOverrideDefault) { + return new RequestInfo( + token, TYPE_CREATE, appPackageName, createCredentialRequest, null, + hasPermissionToOverrideDefault); } /** Creates new {@code RequestInfo} for a get-credential flow. */ @@ -89,7 +106,18 @@ public final class RequestInfo implements Parcelable { @NonNull IBinder token, @NonNull GetCredentialRequest getCredentialRequest, @NonNull String appPackageName) { return new RequestInfo( - token, TYPE_GET, appPackageName, null, getCredentialRequest); + token, TYPE_GET, appPackageName, null, getCredentialRequest, + /*hasPermissionToOverrideDefault=*/ false); + } + + + /** + * Returns whether the calling package has the permission + * + * @hide + */ + public boolean hasPermissionToOverrideDefault() { + return mHasPermissionToOverrideDefault; } /** Returns the request token matching the user request. */ @@ -132,12 +160,14 @@ public final class RequestInfo implements Parcelable { private RequestInfo(@NonNull IBinder token, @NonNull @RequestType String type, @NonNull String appPackageName, @Nullable CreateCredentialRequest createCredentialRequest, - @Nullable GetCredentialRequest getCredentialRequest) { + @Nullable GetCredentialRequest getCredentialRequest, + boolean hasPermissionToOverrideDefault) { mToken = token; mType = type; mAppPackageName = appPackageName; mCreateCredentialRequest = createCredentialRequest; mGetCredentialRequest = getCredentialRequest; + mHasPermissionToOverrideDefault = hasPermissionToOverrideDefault; } private RequestInfo(@NonNull Parcel in) { @@ -157,6 +187,7 @@ public final class RequestInfo implements Parcelable { AnnotationValidations.validate(NonNull.class, null, mAppPackageName); mCreateCredentialRequest = createCredentialRequest; mGetCredentialRequest = getCredentialRequest; + mHasPermissionToOverrideDefault = in.readBoolean(); } @Override @@ -166,6 +197,7 @@ public final class RequestInfo implements Parcelable { dest.writeString8(mAppPackageName); dest.writeTypedObject(mCreateCredentialRequest, flags); dest.writeTypedObject(mGetCredentialRequest, flags); + dest.writeBoolean(mHasPermissionToOverrideDefault); } @Override diff --git a/core/java/android/hardware/biometrics/IBiometricContextListener.aidl b/core/java/android/hardware/biometrics/IBiometricContextListener.aidl index 18979a9f78eb..bf3df90c3e80 100644 --- a/core/java/android/hardware/biometrics/IBiometricContextListener.aidl +++ b/core/java/android/hardware/biometrics/IBiometricContextListener.aidl @@ -23,10 +23,10 @@ package android.hardware.biometrics; * @hide */ oneway interface IBiometricContextListener { - // Called when doze or awake (screen on) status changes. + // Called when aod or awake (screen on) status changes. // These may be called while the device is still transitioning to the new state // (i.e. about to become awake or enter doze) - void onDozeChanged(boolean isDozing, boolean isAwake); + void onDozeChanged(boolean isAod, boolean isAwake); @VintfStability @Backing(type="int") @@ -39,4 +39,8 @@ oneway interface IBiometricContextListener { // Called when the fold state of the device changes. void onFoldChanged(FoldState FoldState); + + // Called when the display state of the device changes. + // Where `displayState` is defined in AuthenticateOptions.DisplayState + void onDisplayStateChanged(int displayState); } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 5dc3825215c0..8a4a0e40d54a 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -34,12 +34,10 @@ import android.content.Context; import android.hardware.BatteryState; import android.hardware.SensorManager; import android.hardware.lights.LightsManager; -import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.InputEventInjectionSync; -import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Vibrator; @@ -392,12 +390,7 @@ public final class InputManager { * @hide */ public boolean isInputDeviceEnabled(int id) { - try { - return mIm.isInputDeviceEnabled(id); - } catch (RemoteException ex) { - Log.w(TAG, "Could not check enabled status of input device with id = " + id); - throw ex.rethrowFromSystemServer(); - } + return mGlobal.isInputDeviceEnabled(id); } /** @@ -411,12 +404,7 @@ public final class InputManager { * @hide */ public void enableInputDevice(int id) { - try { - mIm.enableInputDevice(id); - } catch (RemoteException ex) { - Log.w(TAG, "Could not enable input device with id = " + id); - throw ex.rethrowFromSystemServer(); - } + mGlobal.enableInputDevice(id); } /** @@ -430,12 +418,7 @@ public final class InputManager { * @hide */ public void disableInputDevice(int id) { - try { - mIm.disableInputDevice(id); - } catch (RemoteException ex) { - Log.w(TAG, "Could not disable input device with id = " + id); - throw ex.rethrowFromSystemServer(); - } + mGlobal.disableInputDevice(id); } /** @@ -1007,13 +990,7 @@ public final class InputManager { * @hide */ public boolean[] deviceHasKeys(int id, int[] keyCodes) { - boolean[] ret = new boolean[keyCodes.length]; - try { - mIm.hasKeys(id, InputDevice.SOURCE_ANY, keyCodes, ret); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - return ret; + return mGlobal.deviceHasKeys(id, keyCodes); } /** @@ -1038,11 +1015,7 @@ public final class InputManager { * @hide */ public int getKeyCodeForKeyLocation(int deviceId, int locationKeyCode) { - try { - return mIm.getKeyCodeForKeyLocation(deviceId, locationKeyCode); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return mGlobal.getKeyCodeForKeyLocation(deviceId, locationKeyCode); } /** @@ -1075,20 +1048,7 @@ public final class InputManager { */ @RequiresPermission(Manifest.permission.INJECT_EVENTS) public boolean injectInputEvent(InputEvent event, int mode, int targetUid) { - if (event == null) { - throw new IllegalArgumentException("event must not be null"); - } - if (mode != InputEventInjectionSync.NONE - && mode != InputEventInjectionSync.WAIT_FOR_FINISHED - && mode != InputEventInjectionSync.WAIT_FOR_RESULT) { - throw new IllegalArgumentException("mode is invalid"); - } - - try { - return mIm.injectInputEventToTarget(event, mode, targetUid); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } + return mGlobal.injectInputEvent(event, mode, targetUid); } /** @@ -1114,7 +1074,7 @@ public final class InputManager { @RequiresPermission(Manifest.permission.INJECT_EVENTS) @UnsupportedAppUsage public boolean injectInputEvent(InputEvent event, int mode) { - return injectInputEvent(event, mode, Process.INVALID_UID); + return mGlobal.injectInputEvent(event, mode); } /** @@ -1149,20 +1109,12 @@ public final class InputManager { */ @UnsupportedAppUsage public void setPointerIconType(int iconId) { - try { - mIm.setPointerIconType(iconId); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } + mGlobal.setPointerIconType(iconId); } /** @hide */ public void setCustomPointerIcon(PointerIcon icon) { - try { - mIm.setCustomPointerIcon(icon); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } + mGlobal.setCustomPointerIcon(icon); } /** @@ -1191,11 +1143,7 @@ public final class InputManager { * @hide */ public void requestPointerCapture(IBinder windowToken, boolean enable) { - try { - mIm.requestPointerCapture(windowToken, enable); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } + mGlobal.requestPointerCapture(windowToken, enable); } /** @@ -1204,11 +1152,7 @@ public final class InputManager { * @hide */ public InputMonitor monitorGestureInput(String name, int displayId) { - try { - return mIm.monitorGestureInput(new Binder(), name, displayId); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } + return mGlobal.monitorGestureInput(name, displayId); } /** @@ -1313,12 +1257,9 @@ public final class InputManager { * @hide */ @TestApi - public void addUniqueIdAssociation(@NonNull String inputPort, @NonNull String displayUniqueId) { - try { - mIm.addUniqueIdAssociation(inputPort, displayUniqueId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + public void addUniqueIdAssociation(@NonNull String inputPort, + @NonNull String displayUniqueId) { + mGlobal.addUniqueIdAssociation(inputPort, displayUniqueId); } /** @@ -1331,11 +1272,7 @@ public final class InputManager { */ @TestApi public void removeUniqueIdAssociation(@NonNull String inputPort) { - try { - mIm.removeUniqueIdAssociation(inputPort); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + mGlobal.removeUniqueIdAssociation(inputPort); } /** @@ -1361,11 +1298,7 @@ public final class InputManager { @RequiresPermission(Manifest.permission.BLUETOOTH) @Nullable public String getInputDeviceBluetoothAddress(int deviceId) { - try { - return mIm.getInputDeviceBluetoothAddress(deviceId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return mGlobal.getInputDeviceBluetoothAddress(deviceId); } /** @@ -1423,11 +1356,7 @@ public final class InputManager { * @hide */ public void cancelCurrentTouch() { - try { - mIm.cancelCurrentTouch(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + mGlobal.cancelCurrentTouch(); } /** @@ -1451,11 +1380,7 @@ public final class InputManager { */ @RequiresPermission(Manifest.permission.MONITOR_INPUT) public void pilferPointers(IBinder inputChannelToken) { - try { - mIm.pilferPointers(inputChannelToken); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + mGlobal.pilferPointers(inputChannelToken); } /** diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java index 08d81bd3c325..6e7e90e103e8 100644 --- a/core/java/android/hardware/input/InputManagerGlobal.java +++ b/core/java/android/hardware/input/InputManagerGlobal.java @@ -30,19 +30,27 @@ import android.hardware.input.InputManager.OnTabletModeChangedListener; import android.hardware.lights.Light; import android.hardware.lights.LightState; import android.hardware.lights.LightsRequest; +import android.os.Binder; import android.os.CombinedVibration; import android.os.Handler; import android.os.IBinder; import android.os.IVibratorStateListener; +import android.os.InputEventInjectionSync; import android.os.Looper; import android.os.Message; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.VibrationEffect; +import android.os.Vibrator; +import android.os.VibratorManager; import android.util.Log; import android.util.SparseArray; import android.view.Display; import android.view.InputDevice; +import android.view.InputEvent; +import android.view.InputMonitor; +import android.view.PointerIcon; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; @@ -359,6 +367,42 @@ public final class InputManagerGlobal { } /** + * @see InputManager#isInputDeviceEnabled(int) + */ + public boolean isInputDeviceEnabled(int id) { + try { + return mIm.isInputDeviceEnabled(id); + } catch (RemoteException ex) { + Log.w(TAG, "Could not check enabled status of input device with id = " + id); + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#enableInputDevice(int) + */ + public void enableInputDevice(int id) { + try { + mIm.enableInputDevice(id); + } catch (RemoteException ex) { + Log.w(TAG, "Could not enable input device with id = " + id); + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#disableInputDevice(int) + */ + public void disableInputDevice(int id) { + try { + mIm.disableInputDevice(id); + } catch (RemoteException ex) { + Log.w(TAG, "Could not disable input device with id = " + id); + throw ex.rethrowFromSystemServer(); + } + } + + /** * @see InputManager#getInputDeviceByDescriptor */ InputDevice getInputDeviceByDescriptor(String descriptor) { @@ -672,7 +716,7 @@ public final class InputManagerGlobal { * @see InputManager#getInputDeviceBatteryState(int, boolean) */ @NonNull - BatteryState getInputDeviceBatteryState(int deviceId, boolean hasBattery) { + public BatteryState getInputDeviceBatteryState(int deviceId, boolean hasBattery) { if (!hasBattery) { return new LocalBatteryState(); } @@ -835,7 +879,7 @@ public final class InputManagerGlobal { * @see InputManager#getInputDeviceSensorManager(int) */ @NonNull - SensorManager getInputDeviceSensorManager(int deviceId) { + public SensorManager getInputDeviceSensorManager(int deviceId) { if (mInputDeviceSensorManager == null) { mInputDeviceSensorManager = new InputDeviceSensorManager(this); } @@ -980,6 +1024,21 @@ public final class InputManagerGlobal { } } + /** + * @see InputManager#getInputDeviceVibrator(int, int) + */ + public Vibrator getInputDeviceVibrator(int deviceId, int vibratorId) { + return new InputDeviceVibrator(deviceId, vibratorId); + } + + /** + * @see InputManager#getInputDeviceVibratorManager(int) + */ + @NonNull + public VibratorManager getInputDeviceVibratorManager(int deviceId) { + return new InputDeviceVibratorManager(deviceId); + } + /* * Get the list of device vibrators * @return The list of vibrators IDs @@ -1057,4 +1116,158 @@ public final class InputManagerGlobal { throw ex.rethrowFromSystemServer(); } } + + /** + * @see InputManager#deviceHasKeys(int, int[]) + */ + public boolean[] deviceHasKeys(int id, int[] keyCodes) { + boolean[] ret = new boolean[keyCodes.length]; + try { + mIm.hasKeys(id, InputDevice.SOURCE_ANY, keyCodes, ret); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + return ret; + } + + /** + * @see InputManager#getKeyCodeforKeyLocation(int, int) + */ + public int getKeyCodeForKeyLocation(int deviceId, int locationKeyCode) { + try { + return mIm.getKeyCodeForKeyLocation(deviceId, locationKeyCode); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#injectInputEvent(InputEvent, int, int) + */ + + public boolean injectInputEvent(InputEvent event, int mode, int targetUid) { + if (event == null) { + throw new IllegalArgumentException("event must not be null"); + } + if (mode != InputEventInjectionSync.NONE + && mode != InputEventInjectionSync.WAIT_FOR_FINISHED + && mode != InputEventInjectionSync.WAIT_FOR_RESULT) { + throw new IllegalArgumentException("mode is invalid"); + } + + try { + return mIm.injectInputEventToTarget(event, mode, targetUid); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#injectInputEvent(InputEvent, int) + */ + public boolean injectInputEvent(InputEvent event, int mode) { + return injectInputEvent(event, mode, Process.INVALID_UID); + } + + /** + * @see InputManager#setPointerIconType(int) + */ + public void setPointerIconType(int iconId) { + try { + mIm.setPointerIconType(iconId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#setCustomPointerIcon(PointerIcon) + */ + public void setCustomPointerIcon(PointerIcon icon) { + try { + mIm.setCustomPointerIcon(icon); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#requestPointerCapture(IBinder, boolean) + */ + void requestPointerCapture(IBinder windowToken, boolean enable) { + try { + mIm.requestPointerCapture(windowToken, enable); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see Inputmanager#monitorGestureInput(String, int) + */ + InputMonitor monitorGestureInput(String name, int displayId) { + try { + return mIm.monitorGestureInput(new Binder(), name, displayId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#addUniqueIdAssociation(String, String) + */ + void addUniqueIdAssociation(@NonNull String inputPort, @NonNull String displayUniqueId) { + try { + mIm.addUniqueIdAssociation(inputPort, displayUniqueId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#removeUniqueIdAssociation(String) + */ + public void removeUniqueIdAssociation(@NonNull String inputPort) { + try { + mIm.removeUniqueIdAssociation(inputPort); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#getInputDeviceBluetoothAddress(int) + */ + @RequiresPermission(Manifest.permission.BLUETOOTH) + @Nullable + public String getInputDeviceBluetoothAddress(int deviceId) { + try { + return mIm.getInputDeviceBluetoothAddress(deviceId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#cancelCurrentTouch() + */ + void cancelCurrentTouch() { + try { + mIm.cancelCurrentTouch(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @see InputManager#pilferPointers(IBinder) + */ + @RequiresPermission(Manifest.permission.MONITOR_INPUT) + void pilferPointers(IBinder inputChannelToken) { + try { + mIm.pilferPointers(inputChannelToken); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/hardware/input/VirtualKeyEvent.java b/core/java/android/hardware/input/VirtualKeyEvent.java index dc30e55e36fc..dc47f0820582 100644 --- a/core/java/android/hardware/input/VirtualKeyEvent.java +++ b/core/java/android/hardware/input/VirtualKeyEvent.java @@ -21,6 +21,8 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.view.InputEvent; import android.view.KeyEvent; import java.lang.annotation.Retention; @@ -177,21 +179,25 @@ public final class VirtualKeyEvent implements Parcelable { private final @Action int mAction; private final int mKeyCode; + private final long mEventTimeNanos; - private VirtualKeyEvent(@Action int action, int keyCode) { + private VirtualKeyEvent(@Action int action, int keyCode, long eventTimeNanos) { mAction = action; mKeyCode = keyCode; + mEventTimeNanos = eventTimeNanos; } private VirtualKeyEvent(@NonNull Parcel parcel) { mAction = parcel.readInt(); mKeyCode = parcel.readInt(); + mEventTimeNanos = parcel.readLong(); } @Override public void writeToParcel(@NonNull Parcel parcel, int parcelableFlags) { parcel.writeInt(mAction); parcel.writeInt(mKeyCode); + parcel.writeLong(mEventTimeNanos); } @Override @@ -214,12 +220,23 @@ public final class VirtualKeyEvent implements Parcelable { } /** + * Returns the time this event occurred, in the {@link SystemClock#uptimeMillis()} time base but + * with nanosecond (instead of millisecond) precision. + * + * @see InputEvent#getEventTime() + */ + public long getEventTimeNanos() { + return mEventTimeNanos; + } + + /** * Builder for {@link VirtualKeyEvent}. */ public static final class Builder { private @Action int mAction = ACTION_UNKNOWN; private int mKeyCode = -1; + private long mEventTimeNanos = 0L; /** * Creates a {@link VirtualKeyEvent} object with the current builder configuration. @@ -229,7 +246,7 @@ public final class VirtualKeyEvent implements Parcelable { throw new IllegalArgumentException( "Cannot build virtual key event with unset fields"); } - return new VirtualKeyEvent(mAction, mKeyCode); + return new VirtualKeyEvent(mAction, mKeyCode, mEventTimeNanos); } /** @@ -254,6 +271,23 @@ public final class VirtualKeyEvent implements Parcelable { mAction = action; return this; } + + /** + * Sets the time (in nanoseconds) when this specific event was generated. This may be + * obtained from {@link SystemClock#uptimeMillis()} (with nanosecond precision instead of + * millisecond), but can be different depending on the use case. + * This field is optional and can be omitted. + * + * @return this builder, to allow for chaining of calls + * @see InputEvent#getEventTime() + */ + public @NonNull Builder setEventTimeNanos(long eventTimeNanos) { + if (eventTimeNanos < 0L) { + throw new IllegalArgumentException("Event time cannot be negative"); + } + mEventTimeNanos = eventTimeNanos; + return this; + } } public static final @NonNull Parcelable.Creator<VirtualKeyEvent> CREATOR = diff --git a/core/java/android/hardware/input/VirtualMouseButtonEvent.java b/core/java/android/hardware/input/VirtualMouseButtonEvent.java index 2e094cfb4e24..dfdd3b45923b 100644 --- a/core/java/android/hardware/input/VirtualMouseButtonEvent.java +++ b/core/java/android/hardware/input/VirtualMouseButtonEvent.java @@ -21,6 +21,8 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.view.InputEvent; import android.view.MotionEvent; import java.lang.annotation.Retention; @@ -81,21 +83,26 @@ public final class VirtualMouseButtonEvent implements Parcelable { private final @Action int mAction; private final @Button int mButtonCode; + private final long mEventTimeNanos; - private VirtualMouseButtonEvent(@Action int action, @Button int buttonCode) { + private VirtualMouseButtonEvent(@Action int action, @Button int buttonCode, + long eventTimeNanos) { mAction = action; mButtonCode = buttonCode; + mEventTimeNanos = eventTimeNanos; } private VirtualMouseButtonEvent(@NonNull Parcel parcel) { mAction = parcel.readInt(); mButtonCode = parcel.readInt(); + mEventTimeNanos = parcel.readLong(); } @Override public void writeToParcel(@NonNull Parcel parcel, int parcelableFlags) { parcel.writeInt(mAction); parcel.writeInt(mButtonCode); + parcel.writeLong(mEventTimeNanos); } @Override @@ -118,12 +125,23 @@ public final class VirtualMouseButtonEvent implements Parcelable { } /** + * Returns the time this event occurred, in the {@link SystemClock#uptimeMillis()} time base but + * with nanosecond (instead of millisecond) precision. + * + * @see InputEvent#getEventTime() + */ + public long getEventTimeNanos() { + return mEventTimeNanos; + } + + /** * Builder for {@link VirtualMouseButtonEvent}. */ public static final class Builder { private @Action int mAction = ACTION_UNKNOWN; private @Button int mButtonCode = -1; + private long mEventTimeNanos = 0L; /** * Creates a {@link VirtualMouseButtonEvent} object with the current builder configuration. @@ -133,7 +151,7 @@ public final class VirtualMouseButtonEvent implements Parcelable { throw new IllegalArgumentException( "Cannot build virtual mouse button event with unset fields"); } - return new VirtualMouseButtonEvent(mAction, mButtonCode); + return new VirtualMouseButtonEvent(mAction, mButtonCode, mEventTimeNanos); } /** @@ -165,6 +183,23 @@ public final class VirtualMouseButtonEvent implements Parcelable { mAction = action; return this; } + + /** + * Sets the time (in nanoseconds) when this specific event was generated. This may be + * obtained from {@link SystemClock#uptimeMillis()} (with nanosecond precision instead of + * millisecond), but can be different depending on the use case. + * This field is optional and can be omitted. + * + * @return this builder, to allow for chaining of calls + * @see InputEvent#getEventTime() + */ + public @NonNull Builder setEventTimeNanos(long eventTimeNanos) { + if (eventTimeNanos < 0L) { + throw new IllegalArgumentException("Event time cannot be negative"); + } + this.mEventTimeNanos = eventTimeNanos; + return this; + } } public static final @NonNull Parcelable.Creator<VirtualMouseButtonEvent> CREATOR = diff --git a/core/java/android/hardware/input/VirtualMouseRelativeEvent.java b/core/java/android/hardware/input/VirtualMouseRelativeEvent.java index 65ed1f2f6f3a..e6ad118a2ee0 100644 --- a/core/java/android/hardware/input/VirtualMouseRelativeEvent.java +++ b/core/java/android/hardware/input/VirtualMouseRelativeEvent.java @@ -20,6 +20,8 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.view.InputEvent; /** * An event describing a mouse movement interaction originating from a remote device. @@ -33,21 +35,25 @@ public final class VirtualMouseRelativeEvent implements Parcelable { private final float mRelativeX; private final float mRelativeY; + private final long mEventTimeNanos; - private VirtualMouseRelativeEvent(float relativeX, float relativeY) { + private VirtualMouseRelativeEvent(float relativeX, float relativeY, long eventTimeNanos) { mRelativeX = relativeX; mRelativeY = relativeY; + mEventTimeNanos = eventTimeNanos; } private VirtualMouseRelativeEvent(@NonNull Parcel parcel) { mRelativeX = parcel.readFloat(); mRelativeY = parcel.readFloat(); + mEventTimeNanos = parcel.readLong(); } @Override public void writeToParcel(@NonNull Parcel parcel, int parcelableFlags) { parcel.writeFloat(mRelativeX); parcel.writeFloat(mRelativeY); + parcel.writeLong(mEventTimeNanos); } @Override @@ -70,19 +76,30 @@ public final class VirtualMouseRelativeEvent implements Parcelable { } /** + * Returns the time this event occurred, in the {@link SystemClock#uptimeMillis()} time base but + * with nanosecond (instead of millisecond) precision. + * + * @see InputEvent#getEventTime() + */ + public long getEventTimeNanos() { + return mEventTimeNanos; + } + + /** * Builder for {@link VirtualMouseRelativeEvent}. */ public static final class Builder { private float mRelativeX; private float mRelativeY; + private long mEventTimeNanos = 0L; /** * Creates a {@link VirtualMouseRelativeEvent} object with the current builder * configuration. */ public @NonNull VirtualMouseRelativeEvent build() { - return new VirtualMouseRelativeEvent(mRelativeX, mRelativeY); + return new VirtualMouseRelativeEvent(mRelativeX, mRelativeY, mEventTimeNanos); } /** @@ -104,6 +121,23 @@ public final class VirtualMouseRelativeEvent implements Parcelable { mRelativeY = relativeY; return this; } + + /** + * Sets the time (in nanoseconds) when this specific event was generated. This may be + * obtained from {@link SystemClock#uptimeMillis()} (with nanosecond precision instead of + * millisecond), but can be different depending on the use case. + * This field is optional and can be omitted. + * + * @return this builder, to allow for chaining of calls + * @see InputEvent#getEventTime() + */ + public @NonNull Builder setEventTimeNanos(long eventTimeNanos) { + if (eventTimeNanos < 0L) { + throw new IllegalArgumentException("Event time cannot be negative"); + } + this.mEventTimeNanos = eventTimeNanos; + return this; + } } public static final @NonNull Parcelable.Creator<VirtualMouseRelativeEvent> CREATOR = diff --git a/core/java/android/hardware/input/VirtualMouseScrollEvent.java b/core/java/android/hardware/input/VirtualMouseScrollEvent.java index 1723259ba4b7..4d0a1576b6ee 100644 --- a/core/java/android/hardware/input/VirtualMouseScrollEvent.java +++ b/core/java/android/hardware/input/VirtualMouseScrollEvent.java @@ -21,6 +21,8 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.view.InputEvent; import com.android.internal.util.Preconditions; @@ -36,21 +38,26 @@ public final class VirtualMouseScrollEvent implements Parcelable { private final float mXAxisMovement; private final float mYAxisMovement; + private final long mEventTimeNanos; - private VirtualMouseScrollEvent(float xAxisMovement, float yAxisMovement) { + private VirtualMouseScrollEvent(float xAxisMovement, float yAxisMovement, + long eventTimeNanos) { mXAxisMovement = xAxisMovement; mYAxisMovement = yAxisMovement; + mEventTimeNanos = eventTimeNanos; } private VirtualMouseScrollEvent(@NonNull Parcel parcel) { mXAxisMovement = parcel.readFloat(); mYAxisMovement = parcel.readFloat(); + mEventTimeNanos = parcel.readLong(); } @Override public void writeToParcel(@NonNull Parcel parcel, int parcelableFlags) { parcel.writeFloat(mXAxisMovement); parcel.writeFloat(mYAxisMovement); + parcel.writeLong(mEventTimeNanos); } @Override @@ -75,18 +82,29 @@ public final class VirtualMouseScrollEvent implements Parcelable { } /** + * Returns the time this event occurred, in the {@link SystemClock#uptimeMillis()} time base but + * with nanosecond (instead of millisecond) precision. + * + * @see InputEvent#getEventTime() + */ + public long getEventTimeNanos() { + return mEventTimeNanos; + } + + /** * Builder for {@link VirtualMouseScrollEvent}. */ public static final class Builder { private float mXAxisMovement; private float mYAxisMovement; + private long mEventTimeNanos = 0L; /** * Creates a {@link VirtualMouseScrollEvent} object with the current builder configuration. */ public @NonNull VirtualMouseScrollEvent build() { - return new VirtualMouseScrollEvent(mXAxisMovement, mYAxisMovement); + return new VirtualMouseScrollEvent(mXAxisMovement, mYAxisMovement, mEventTimeNanos); } /** @@ -114,6 +132,23 @@ public final class VirtualMouseScrollEvent implements Parcelable { mYAxisMovement = yAxisMovement; return this; } + + /** + * Sets the time (in nanoseconds) when this specific event was generated. This may be + * obtained from {@link SystemClock#uptimeMillis()} (with nanosecond precision instead of + * millisecond), but can be different depending on the use case. + * This field is optional and can be omitted. + * + * @return this builder, to allow for chaining of calls + * @see InputEvent#getEventTime() + */ + public @NonNull Builder setEventTimeNanos(long eventTimeNanos) { + if (eventTimeNanos < 0L) { + throw new IllegalArgumentException("Event time cannot be negative"); + } + mEventTimeNanos = eventTimeNanos; + return this; + } } public static final @NonNull Parcelable.Creator<VirtualMouseScrollEvent> CREATOR = diff --git a/core/java/android/hardware/input/VirtualTouchEvent.java b/core/java/android/hardware/input/VirtualTouchEvent.java index a2bb382e9950..73da5d92ddd0 100644 --- a/core/java/android/hardware/input/VirtualTouchEvent.java +++ b/core/java/android/hardware/input/VirtualTouchEvent.java @@ -23,6 +23,8 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.view.InputEvent; import android.view.MotionEvent; import java.lang.annotation.Retention; @@ -94,9 +96,10 @@ public final class VirtualTouchEvent implements Parcelable { private final float mY; private final float mPressure; private final float mMajorAxisSize; + private final long mEventTimeNanos; private VirtualTouchEvent(int pointerId, @ToolType int toolType, @Action int action, - float x, float y, float pressure, float majorAxisSize) { + float x, float y, float pressure, float majorAxisSize, long eventTimeNanos) { mPointerId = pointerId; mToolType = toolType; mAction = action; @@ -104,6 +107,7 @@ public final class VirtualTouchEvent implements Parcelable { mY = y; mPressure = pressure; mMajorAxisSize = majorAxisSize; + mEventTimeNanos = eventTimeNanos; } private VirtualTouchEvent(@NonNull Parcel parcel) { @@ -114,6 +118,7 @@ public final class VirtualTouchEvent implements Parcelable { mY = parcel.readFloat(); mPressure = parcel.readFloat(); mMajorAxisSize = parcel.readFloat(); + mEventTimeNanos = parcel.readLong(); } @Override @@ -125,6 +130,7 @@ public final class VirtualTouchEvent implements Parcelable { dest.writeFloat(mY); dest.writeFloat(mPressure); dest.writeFloat(mMajorAxisSize); + dest.writeLong(mEventTimeNanos); } @Override @@ -182,6 +188,16 @@ public final class VirtualTouchEvent implements Parcelable { } /** + * Returns the time this event occurred, in the {@link SystemClock#uptimeMillis()} time base but + * with nanosecond (instead of millisecond) precision. + * + * @see InputEvent#getEventTime() + */ + public long getEventTimeNanos() { + return mEventTimeNanos; + } + + /** * Builder for {@link VirtualTouchEvent}. */ public static final class Builder { @@ -193,6 +209,7 @@ public final class VirtualTouchEvent implements Parcelable { private float mY = Float.NaN; private float mPressure = Float.NaN; private float mMajorAxisSize = Float.NaN; + private long mEventTimeNanos = 0L; /** * Creates a {@link VirtualTouchEvent} object with the current builder configuration. @@ -213,7 +230,7 @@ public final class VirtualTouchEvent implements Parcelable { "ACTION_CANCEL and TOOL_TYPE_PALM must always appear together"); } return new VirtualTouchEvent(mPointerId, mToolType, mAction, mX, mY, mPressure, - mMajorAxisSize); + mMajorAxisSize, mEventTimeNanos); } /** @@ -317,6 +334,23 @@ public final class VirtualTouchEvent implements Parcelable { mMajorAxisSize = majorAxisSize; return this; } + + /** + * Sets the time (in nanoseconds) when this specific event was generated. This may be + * obtained from {@link SystemClock#uptimeMillis()} (with nanosecond precision instead of + * millisecond), but can be different depending on the use case. + * This field is optional and can be omitted. + * + * @return this builder, to allow for chaining of calls + * @see InputEvent#getEventTime() + */ + public @NonNull Builder setEventTimeNanos(long eventTimeNanos) { + if (eventTimeNanos < 0L) { + throw new IllegalArgumentException("Event time cannot be negative"); + } + mEventTimeNanos = eventTimeNanos; + return this; + } } public static final @NonNull Parcelable.Creator<VirtualTouchEvent> CREATOR = diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index cbbd16b21f0d..fa16e167f7d1 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -42,6 +42,7 @@ import android.content.Context; import android.media.AudioFormat; import android.media.permission.Identity; import android.media.soundtrigger.Status; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; import android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; import android.os.Build; @@ -77,9 +78,11 @@ public class SoundTrigger { } /** + * Model architecture associated with a fake STHAL which can be injected. + * Used for testing purposes. * @hide */ - public static final String FAKE_HAL_ARCH = "injection"; + public static final String FAKE_HAL_ARCH = ISoundTriggerInjection.FAKE_HAL_ARCH; /** * Status code used when the operation succeeded diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java index a20191cab774..74775a820620 100644 --- a/core/java/android/net/Ikev2VpnProfile.java +++ b/core/java/android/net/Ikev2VpnProfile.java @@ -769,6 +769,19 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { } } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("IkeV2VpnProfile ["); + sb.append(" MaxMtu=" + mMaxMtu); + if (mIsBypassable) sb.append(" Bypassable"); + if (mRequiresInternetValidation) sb.append(" RequiresInternetValidation"); + if (mIsRestrictedToTestNetworks) sb.append(" RestrictedToTestNetworks"); + if (mAutomaticNattKeepaliveTimerEnabled) sb.append(" AutomaticNattKeepaliveTimerEnabled"); + if (mAutomaticIpVersionSelectionEnabled) sb.append(" AutomaticIpVersionSelectionEnabled"); + sb.append("]"); + return sb.toString(); + } + /** A incremental builder for IKEv2 VPN profiles */ public static final class Builder { private int mType = -1; diff --git a/core/java/android/os/RemoteException.java b/core/java/android/os/RemoteException.java index 878e1413a8c9..970f4192c36c 100644 --- a/core/java/android/os/RemoteException.java +++ b/core/java/android/os/RemoteException.java @@ -21,6 +21,12 @@ import android.util.AndroidException; /** * Parent exception for all Binder remote-invocation errors + * + * Note: not all exceptions from binder services will be subclasses of this. + * For instance, RuntimeException and several subclasses of it may be + * thrown as well as OutOfMemoryException. + * + * One common subclass is {@link DeadObjectException}. */ public class RemoteException extends AndroidException { public RemoteException() { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 89b768d7dff7..5137bc14339f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11849,7 +11849,13 @@ public final class Settings { /** * Value to specify if the device's UTC system clock should be set automatically, e.g. using - * telephony signals like NITZ, or other sources like GNSS or NTP. 1=yes, 0=no (manual) + * telephony signals like NITZ, or other sources like GNSS or NTP. + * + * <p>Prefer {@link android.app.time.TimeManager} API calls to determine the state of + * automatic time detection instead of directly observing this setting as it may be ignored + * by the time_detector service under various conditions. + * + * <p>1=yes, 0=no (manual) */ @Readable public static final String AUTO_TIME = "auto_time"; @@ -11857,12 +11863,35 @@ public final class Settings { /** * Value to specify if the device's time zone system property should be set automatically, * e.g. using telephony signals like MCC and NITZ, or other mechanisms like the location. - * 1=yes, 0=no (manual). + * + * <p>Prefer {@link android.app.time.TimeManager} API calls to determine the state of + * automatic time zone detection instead of directly observing this setting as it may be + * ignored by the time_zone_detector service under various conditions. + * + * <p>1=yes, 0=no (manual). */ @Readable public static final String AUTO_TIME_ZONE = "auto_time_zone"; /** + * Records whether an explicit preference for {@link #AUTO_TIME_ZONE} has been expressed + * instead of the current value being the default. This value is used to tell if the {@link + * #AUTO_TIME_ZONE} value can be influenced by experiment flags that alter the setting's + * value for internal testers: once the user indicates a preference they leave the + * experiment, only users that are still using the default will be affected by the flag. + * + * <p>Since {@link #AUTO_TIME_ZONE} can be altered by components besides the system server, + * and not just via the time_zone_detector logic that sets this value, this isn't guaranteed + * to be set when the device diverges from the default in all cases. Important AOSP system + * components like SettingsUI do use the time_zone_detector APIs. + * + * <p>1="has been set explicitly" + * + * @hide + */ + public static final String AUTO_TIME_ZONE_EXPLICIT = "auto_time_zone_explicit"; + + /** * URI for the car dock "in" event sound. * @hide */ diff --git a/core/java/android/service/credentials/Action.java b/core/java/android/service/credentials/Action.java index 7487ac022c8e..55133aea4fd6 100644 --- a/core/java/android/service/credentials/Action.java +++ b/core/java/android/service/credentials/Action.java @@ -17,7 +17,6 @@ package android.service.credentials; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.app.PendingIntent; import android.app.slice.Slice; import android.os.Parcel; @@ -31,14 +30,8 @@ import java.util.Objects; * * <p>If user selects this action entry, the corresponding {@link PendingIntent} set on the * {@code slice} as a {@link androidx.slice.core.SliceAction} will get invoked. - * - * <p>Any class that derives this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. */ -@SuppressLint("ParcelNotFinal") -public class Action implements Parcelable { +public final class Action implements Parcelable { /** Slice object containing display content to be displayed with this action on the UI. */ @NonNull private final Slice mSlice; diff --git a/core/java/android/service/credentials/BeginCreateCredentialRequest.java b/core/java/android/service/credentials/BeginCreateCredentialRequest.java index 1ca004955052..89aaa5ba7011 100644 --- a/core/java/android/service/credentials/BeginCreateCredentialRequest.java +++ b/core/java/android/service/credentials/BeginCreateCredentialRequest.java @@ -18,7 +18,6 @@ package android.service.credentials; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -29,14 +28,8 @@ import com.android.internal.util.Preconditions; * Request for beginning a create credential request. * * See {@link BeginCreateCredentialResponse} for the counterpart response - * - * <p>Any class that derives this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. */ -@SuppressLint("ParcelNotFinal") -public class BeginCreateCredentialRequest implements Parcelable { +public final class BeginCreateCredentialRequest implements Parcelable { private final @Nullable CallingAppInfo mCallingAppInfo; private final @NonNull String mType; private final @NonNull Bundle mData; diff --git a/core/java/android/service/credentials/BeginGetCredentialOption.java b/core/java/android/service/credentials/BeginGetCredentialOption.java index 1ad0424f44e3..b5f82d8949a1 100644 --- a/core/java/android/service/credentials/BeginGetCredentialOption.java +++ b/core/java/android/service/credentials/BeginGetCredentialOption.java @@ -17,7 +17,6 @@ package android.service.credentials; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -29,14 +28,8 @@ import com.android.internal.util.Preconditions; * A specific type of credential request to be sent to the provider during the query phase of * a get flow. This request contains limited parameters needed to populate a list of * {@link CredentialEntry} on the {@link BeginGetCredentialResponse}. - * - * <p>Any class that derives this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. */ -@SuppressLint("ParcelNotFinal") -public class BeginGetCredentialOption implements Parcelable { +public final class BeginGetCredentialOption implements Parcelable { private static final String BUNDLE_ID_KEY = "android.service.credentials.BeginGetCredentialOption.BUNDLE_ID_KEY"; /** diff --git a/core/java/android/service/credentials/CreateEntry.java b/core/java/android/service/credentials/CreateEntry.java index 106e65c3d70e..6a9f09f257f3 100644 --- a/core/java/android/service/credentials/CreateEntry.java +++ b/core/java/android/service/credentials/CreateEntry.java @@ -17,7 +17,6 @@ package android.service.credentials; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.app.PendingIntent; import android.app.slice.Slice; import android.os.Parcel; @@ -33,14 +32,8 @@ import android.os.Parcelable; * the {@link android.app.Activity} result should be set to {@link android.app.Activity#RESULT_OK}, * and the {@link CredentialProviderService#EXTRA_CREATE_CREDENTIAL_RESPONSE} must be set with a * {@link android.credentials.CreateCredentialResponse} object. - * - * <p>Any class that derives this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. */ -@SuppressLint("ParcelNotFinal") -public class CreateEntry implements Parcelable { +public final class CreateEntry implements Parcelable { private final @NonNull Slice mSlice; private CreateEntry(@NonNull Parcel in) { diff --git a/core/java/android/service/credentials/CredentialEntry.java b/core/java/android/service/credentials/CredentialEntry.java index e9cebd2e6af7..512d8339e944 100644 --- a/core/java/android/service/credentials/CredentialEntry.java +++ b/core/java/android/service/credentials/CredentialEntry.java @@ -20,7 +20,6 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; import android.app.PendingIntent; import android.app.slice.Slice; import android.credentials.GetCredentialResponse; @@ -44,19 +43,8 @@ import com.android.internal.util.Preconditions; * result should be set to {@link android.app.Activity#RESULT_OK}, and the * {@link CredentialProviderService#EXTRA_GET_CREDENTIAL_RESPONSE} must be set with a * {@link GetCredentialResponse} object. - * - * <p>Any class that derives this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. - * - * <p>While creating this entry, providers must set a {@code requestId} to be retrieved - * from {@link BeginGetCredentialOption#getId()}, to determine for which request this entry is - * being presented to the user. This will ensure that when user selects the entry, the correct - * complete request is added to the {@link PendingIntent} mentioned above. */ -@SuppressLint("ParcelNotFinal") -public class CredentialEntry implements Parcelable { +public final class CredentialEntry implements Parcelable { /** The request option that corresponds to this entry. **/ private final @Nullable String mBeginGetCredentialOptionId; diff --git a/core/java/android/service/credentials/CredentialProviderInfoFactory.java b/core/java/android/service/credentials/CredentialProviderInfoFactory.java index 8069414c3e6e..47b75d135813 100644 --- a/core/java/android/service/credentials/CredentialProviderInfoFactory.java +++ b/core/java/android/service/credentials/CredentialProviderInfoFactory.java @@ -163,28 +163,12 @@ public final class CredentialProviderInfoFactory { private static boolean isSystemProviderWithValidPermission( ServiceInfo serviceInfo, Context context) { - requireNonNull(context, "context must not be null"); - - final String permission = Manifest.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE; - try { - ApplicationInfo appInfo = - context.getPackageManager() - .getApplicationInfo( - serviceInfo.packageName, - PackageManager.ApplicationInfoFlags.of( - PackageManager.MATCH_SYSTEM_ONLY)); - if (appInfo != null - && context.checkPermission(permission, /* pid= */ -1, appInfo.uid) - == PackageManager.PERMISSION_GRANTED) { - Slog.i(TAG, "SYS permission granted for: " + serviceInfo.packageName); - return true; - } else { - Slog.i(TAG, "SYS permission failed for: " + serviceInfo.packageName); - } - } catch (PackageManager.NameNotFoundException e) { - Slog.e(TAG, "Error getting info for " + serviceInfo + ": " + e); + if (context == null) { + Slog.w(TAG, "Context is null in isSystemProviderWithValidPermission"); + return false; } - return false; + return PermissionUtils.hasPermission(context, serviceInfo.packageName, + Manifest.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE); } private static boolean isValidSystemProvider( diff --git a/core/java/android/service/credentials/PermissionUtils.java b/core/java/android/service/credentials/PermissionUtils.java new file mode 100644 index 000000000000..c8bb202c35f7 --- /dev/null +++ b/core/java/android/service/credentials/PermissionUtils.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.credentials; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; + +/** + * Utils for checking permissions, or any other permission related function + * + * @hide + */ +public class PermissionUtils { + //TODO(274838409): Move all CredentialManagerService permission checks here + + /** Checks whether the given package name hold the given permission **/ + public static boolean hasPermission(Context context, String packageName, String permission) { + try { + ApplicationInfo appInfo = + context.getPackageManager() + .getApplicationInfo( + packageName, + PackageManager.ApplicationInfoFlags.of( + PackageManager.MATCH_SYSTEM_ONLY)); + if (appInfo != null + && context.checkPermission(permission, /* pid= */ -1, appInfo.uid) + == PackageManager.PERMISSION_GRANTED) { + return true; + } + } catch (PackageManager.NameNotFoundException e) { + } + return false; + } +} + diff --git a/core/java/android/service/credentials/RemoteEntry.java b/core/java/android/service/credentials/RemoteEntry.java index 716c00d726f3..5b3218ad9aa8 100644 --- a/core/java/android/service/credentials/RemoteEntry.java +++ b/core/java/android/service/credentials/RemoteEntry.java @@ -17,7 +17,6 @@ package android.service.credentials; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.app.PendingIntent; import android.app.slice.Slice; import android.os.Parcel; @@ -40,14 +39,8 @@ import android.os.Parcelable; * For a creates flow, invoked through {@link CredentialProviderService#onBeginCreateCredential}, * providers must set a {@link android.credentials.CreateCredentialResponse} on the activity * result against the ket {@link CredentialProviderService#EXTRA_CREATE_CREDENTIAL_RESPONSE}. - * - * <p>Any class that extends this class must only add extra field values to the {@code slice} - * object passed into the constructor. Any other field will not be parceled through. If the - * derived class has custom parceling implementation, this class will not be able to unpack - * the parcel without having access to that implementation. */ -@SuppressLint("ParcelNotFinal") -public class RemoteEntry implements Parcelable { +public final class RemoteEntry implements Parcelable { private final @NonNull Slice mSlice; private RemoteEntry(@NonNull Parcel in) { diff --git a/core/java/android/util/SafetyProtectionUtils.java b/core/java/android/util/SafetyProtectionUtils.java index af985c573063..75eaa9ed84af 100644 --- a/core/java/android/util/SafetyProtectionUtils.java +++ b/core/java/android/util/SafetyProtectionUtils.java @@ -40,14 +40,20 @@ public class SafetyProtectionUtils { * @hide */ public static boolean shouldShowSafetyProtectionResources(Context context) { - return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SAFETY_PROTECTION_RESOURCES_ENABLED, false) - && context.getResources().getBoolean( - Resources.getSystem() - .getIdentifier("config_safetyProtectionEnabled", - "bool", "android")) - && context.getDrawable(android.R.drawable.ic_safety_protection) != null - && context.getString(android.R.string.safety_protection_display_text) != null - && !context.getString(android.R.string.safety_protection_display_text).isEmpty(); + try { + return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SAFETY_PROTECTION_RESOURCES_ENABLED, false) + && context.getResources().getBoolean( + Resources.getSystem() + .getIdentifier("config_safetyProtectionEnabled", + "bool", "android")) + && context.getDrawable(android.R.drawable.ic_safety_protection) != null + && !context.getString( + android.R.string.safety_protection_display_text).isEmpty(); + } catch (Resources.NotFoundException e) { + // We should expect the resources to not exist for non-pixel devices + // (except for the OEMs that opt-in) + return false; + } } } diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java index 61864d776cab..e81aecb23c24 100644 --- a/core/java/android/view/InputDevice.java +++ b/core/java/android/view/InputDevice.java @@ -776,7 +776,7 @@ public final class InputDevice implements Parcelable { * Each gamepad or joystick is given a unique, positive controller number when initially * configured by the system. This number may change due to events such as device disconnects / * reconnects or user initiated reassignment. Any change in number will trigger an event that - * can be observed by registering an {@link InputManager.InputDeviceListener}. + * can be observed by registering an {@link InputManagerGlobal.InputDeviceListener}. * </p> * <p> * All input devices which are not gamepads or joysticks will be assigned a controller number @@ -981,7 +981,7 @@ public final class InputDevice implements Parcelable { * generating the keycode given by the corresponding value at the same index in the keys array. */ public boolean[] hasKeys(int... keys) { - return InputManager.getInstance().deviceHasKeys(mId, keys); + return InputManagerGlobal.getInstance().deviceHasKeys(mId, keys); } /** @@ -1028,7 +1028,8 @@ public final class InputDevice implements Parcelable { * {@link InputDevice#SOURCE_KEYBOARD} or the requested mapping cannot be determined. */ public int getKeyCodeForKeyLocation(int locationKeyCode) { - return InputManager.getInstance().getKeyCodeForKeyLocation(mId, locationKeyCode); + return InputManagerGlobal.getInstance() + .getKeyCodeForKeyLocation(mId, locationKeyCode); } /** @@ -1109,9 +1110,11 @@ public final class InputDevice implements Parcelable { @RequiresPermission(Manifest.permission.BLUETOOTH) @Nullable public String getBluetoothAddress() { - // We query the address via a separate InputManager API instead of pre-populating it in - // this class to avoid leaking it to apps that do not have sufficient permissions. - return InputManager.getInstance().getInputDeviceBluetoothAddress(mId); + // We query the address via a separate InputManagerGlobal API + // instead of pre-populating it in this class to avoid + // leaking it to apps that do not have sufficient permissions. + return InputManagerGlobal.getInstance() + .getInputDeviceBluetoothAddress(mId); } /** @@ -1132,7 +1135,8 @@ public final class InputDevice implements Parcelable { synchronized (mMotionRanges) { if (mVibrator == null) { if (mHasVibrator) { - mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId, + mVibrator = InputManagerGlobal.getInstance() + .getInputDeviceVibrator(mId, VIBRATOR_ID_ALL); } else { mVibrator = NullVibrator.getInstance(); @@ -1154,7 +1158,8 @@ public final class InputDevice implements Parcelable { public VibratorManager getVibratorManager() { synchronized (mMotionRanges) { if (mVibratorManager == null) { - mVibratorManager = InputManager.getInstance().getInputDeviceVibratorManager(mId); + mVibratorManager = InputManagerGlobal.getInstance() + .getInputDeviceVibratorManager(mId); } } return mVibratorManager; @@ -1170,7 +1175,8 @@ public final class InputDevice implements Parcelable { */ @NonNull public BatteryState getBatteryState() { - return InputManager.getInstance().getInputDeviceBatteryState(mId, mHasBattery); + return InputManagerGlobal.getInstance() + .getInputDeviceBatteryState(mId, mHasBattery); } /** @@ -1206,7 +1212,8 @@ public final class InputDevice implements Parcelable { public SensorManager getSensorManager() { synchronized (mMotionRanges) { if (mSensorManager == null) { - mSensorManager = InputManager.getInstance().getInputDeviceSensorManager(mId); + mSensorManager = InputManagerGlobal.getInstance() + .getInputDeviceSensorManager(mId); } } return mSensorManager; @@ -1217,7 +1224,7 @@ public final class InputDevice implements Parcelable { * @return Whether the input device is enabled. */ public boolean isEnabled() { - return InputManager.getInstance().isInputDeviceEnabled(mId); + return InputManagerGlobal.getInstance().isInputDeviceEnabled(mId); } /** @@ -1228,7 +1235,7 @@ public final class InputDevice implements Parcelable { @RequiresPermission(android.Manifest.permission.DISABLE_INPUT_DEVICE) @TestApi public void enable() { - InputManager.getInstance().enableInputDevice(mId); + InputManagerGlobal.getInstance().enableInputDevice(mId); } /** @@ -1239,7 +1246,7 @@ public final class InputDevice implements Parcelable { @RequiresPermission(android.Manifest.permission.DISABLE_INPUT_DEVICE) @TestApi public void disable() { - InputManager.getInstance().disableInputDevice(mId); + InputManagerGlobal.getInstance().disableInputDevice(mId); } /** @@ -1274,7 +1281,7 @@ public final class InputDevice implements Parcelable { * @hide */ public void setPointerType(int pointerType) { - InputManager.getInstance().setPointerIconType(pointerType); + InputManagerGlobal.getInstance().setPointerIconType(pointerType); } /** @@ -1283,7 +1290,7 @@ public final class InputDevice implements Parcelable { * @hide */ public void setCustomPointerIcon(PointerIcon icon) { - InputManager.getInstance().setCustomPointerIcon(icon); + InputManagerGlobal.getInstance().setCustomPointerIcon(icon); } /** @@ -1301,7 +1308,7 @@ public final class InputDevice implements Parcelable { * * @return the supported USI version, or null if the device does not support USI * @see <a href="https://universalstylus.org">Universal Stylus Initiative</a> - * @see InputManager#getHostUsiVersion(int) + * @see InputManagerGlobal#getHostUsiVersion(int) * @hide */ @Nullable diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS index 66fd794e64fc..42ac74ce7353 100644 --- a/core/java/android/view/OWNERS +++ b/core/java/android/view/OWNERS @@ -64,6 +64,9 @@ per-file SurfaceView.java = file:/services/core/java/com/android/server/wm/OWNER per-file SurfaceHolder.java = file:/graphics/java/android/graphics/OWNERS per-file SurfaceHolder.java = file:/services/core/java/com/android/server/wm/OWNERS +# Text +per-file HandwritingInitiator.java = file:/core/java/android/text/OWNERS + # View per-file View.java = file:/services/accessibility/OWNERS per-file View.java = file:/core/java/android/service/autofill/OWNERS diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index b46a68c1d5fd..cdea97ce9b7f 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -33,7 +33,6 @@ import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; -import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; import android.graphics.RenderNode; @@ -851,10 +850,14 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } mParentSurfaceSequenceId = viewRoot.getSurfaceSequenceId(); - if (mViewVisibility) { - surfaceUpdateTransaction.show(mSurfaceControl); - } else { - surfaceUpdateTransaction.hide(mSurfaceControl); + // Only control visibility if we're not hardware-accelerated. Otherwise we'll + // let renderthread drive since offscreen SurfaceControls should not be visible. + if (!isHardwareAccelerated()) { + if (mViewVisibility) { + surfaceUpdateTransaction.show(mSurfaceControl); + } else { + surfaceUpdateTransaction.hide(mSurfaceControl); + } } updateBackgroundVisibility(surfaceUpdateTransaction); @@ -1417,12 +1420,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } private final Rect mRTLastReportedPosition = new Rect(); - private final Point mRTLastReportedSurfaceSize = new Point(); private class SurfaceViewPositionUpdateListener implements RenderNode.PositionUpdateListener { private final int mRtSurfaceWidth; private final int mRtSurfaceHeight; - private boolean mRtFirst = true; private final SurfaceControl.Transaction mPositionChangedTransaction = new SurfaceControl.Transaction(); @@ -1433,15 +1434,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall @Override public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { - if (!mRtFirst && (mRTLastReportedPosition.left == left - && mRTLastReportedPosition.top == top - && mRTLastReportedPosition.right == right - && mRTLastReportedPosition.bottom == bottom - && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth - && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight)) { - return; - } - mRtFirst = false; try { if (DEBUG_POSITION) { Log.d(TAG, String.format( @@ -1452,8 +1444,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } synchronized (mSurfaceControlLock) { if (mSurfaceControl == null) return; + mRTLastReportedPosition.set(left, top, right, bottom); - mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); onSetSurfacePositionAndScale(mPositionChangedTransaction, mSurfaceControl, mRTLastReportedPosition.left /*positionLeft*/, mRTLastReportedPosition.top /*positionTop*/, @@ -1461,10 +1453,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall / (float) mRtSurfaceWidth /*postScaleX*/, mRTLastReportedPosition.height() / (float) mRtSurfaceHeight /*postScaleY*/); - if (mViewVisibility) { - // b/131239825 - mPositionChangedTransaction.show(mSurfaceControl); - } + + mPositionChangedTransaction.show(mSurfaceControl); } applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); } catch (Exception ex) { @@ -1490,7 +1480,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall System.identityHashCode(this), frameNumber)); } mRTLastReportedPosition.setEmpty(); - mRTLastReportedSurfaceSize.set(-1, -1); // positionLost can be called while UI thread is un-paused. synchronized (mSurfaceControlLock) { diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index b17d2b947c66..ddd7734fd1dd 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -832,9 +832,7 @@ public class AccessibilityNodeInfo implements Parcelable { private static final int BOOLEAN_PROPERTY_REQUEST_INITIAL_ACCESSIBILITY_FOCUS = 1 << 24; - private static final int BOOLEAN_PROPERTY_REQUEST_TOUCH_PASSTHROUGH = 1 << 25; - - private static final int BOOLEAN_PROPERTY_ACCESSIBILITY_DATA_SENSITIVE = 1 << 26; + private static final int BOOLEAN_PROPERTY_ACCESSIBILITY_DATA_SENSITIVE = 1 << 25; /** * Bits that provide the id of a virtual descendant of a view. @@ -2599,53 +2597,6 @@ public class AccessibilityNodeInfo implements Parcelable { } /** - * Gets whether this node is one of the candidates that wants touch interaction within its - * screen bounds to bypass the touch exploration and go straight to the underlying view - * hierarchy. - * - * <p> - * {@link android.accessibilityservice.AccessibilityService} could aggregate the {@link - * #getBoundsInScreen()} that has request touch passthrough, and/or doing complex calculation - * with other views that doesn't request touch passthrough, and call {@link - * AccessibilityService#setTouchExplorationPassthroughRegion(int, Region)} to bypass the touch - * interactions to the underlying views within the region. - * </p> - * - * @return True if the node wants touch interaction within its screen bounds to bypass touch - * exploration and go straight to the underlying view hierarchy; false otherwise. - */ - public boolean hasRequestTouchPassthrough() { - return getBooleanProperty(BOOLEAN_PROPERTY_REQUEST_TOUCH_PASSTHROUGH); - } - - /** - * Sets whether this node wants touch interaction within its screen bounds to bypass touch - * exploration and go straight to the underlying view hierarchy. - * <p> - * <strong>Note:</strong> This property allows the - * {@link android.accessibilityservice.AccessibilityService} to calculate the - * aggregated touch passthrough region. App developers need to ensure that the - * {@link #getBoundsInScreen()} of - * the node align with the region they want touchable, and that child nodes overlapping these - * bounds may cause that region to be reduced. - * </p> - * - * <p> - * <strong>Note:</strong> Cannot be called from an - * {@link android.accessibilityservice.AccessibilityService}. - * This class is made immutable before being delivered to an AccessibilityService. - * </p> - * - * @param touchPassthrough True if the node wants touch interaction within its screen bounds - * to bypass touch exploration and go straight to the underlying view - * hierarchy. - * @throws IllegalStateException If called from an AccessibilityService. - */ - public void setRequestTouchPassthrough(boolean touchPassthrough) { - setBooleanProperty(BOOLEAN_PROPERTY_REQUEST_TOUCH_PASSTHROUGH, touchPassthrough); - } - - /** * Gets if the node's accessibility data is considered sensitive. * * @return True if the node's data is considered sensitive, false otherwise. diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl index 62d029bd1be6..8a30f8cebc3d 100644 --- a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl +++ b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl @@ -103,6 +103,13 @@ oneway interface IWindowMagnificationConnection { void removeMagnificationButton(int displayId); /** + * Requests System UI remove magnification settings panel on the specified display. + * + * @param displayId the logical display id. + */ + void removeMagnificationSettingsPanel(int displayId); + + /** * Sets {@link IWindowMagnificationConnectionCallback} to receive the request or the callback. * * @param callback the interface to be called. diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 781a4b63f889..c5befb6f418f 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -2246,7 +2246,7 @@ public final class AutofillManager { @NonNull AutofillRequestCallback callback) { if (mContext.checkSelfPermission(PROVIDE_OWN_AUTOFILL_SUGGESTIONS) != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Requires USE_APP_AUTOFILL permission!"); + throw new SecurityException("Requires PROVIDE_OWN_AUTOFILL_SUGGESTIONS permission!"); } synchronized (mLock) { diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java index ae192a4effc7..75e797b4ec9d 100644 --- a/core/java/com/android/internal/app/IntentForwarderActivity.java +++ b/core/java/com/android/internal/app/IntentForwarderActivity.java @@ -16,14 +16,17 @@ package com.android.internal.app; +import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_PERSONAL; import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_WORK; import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.internal.app.ResolverActivity.EXTRA_CALLING_USER; import static com.android.internal.app.ResolverActivity.EXTRA_SELECTED_PROFILE; import android.annotation.Nullable; +import android.annotation.TestApi; import android.app.Activity; import android.app.ActivityThread; import android.app.AppGlobals; @@ -79,6 +82,10 @@ public class IntentForwarderActivity extends Activity { public static String FORWARD_INTENT_TO_MANAGED_PROFILE = "com.android.internal.app.ForwardIntentToManagedProfile"; + @TestApi + public static final String EXTRA_SKIP_USER_CONFIRMATION = + "com.android.internal.app.EXTRA_SKIP_USER_CONFIRMATION"; + private static final Set<String> ALLOWED_TEXT_MESSAGE_SCHEMES = new HashSet<>(Arrays.asList("sms", "smsto", "mms", "mmsto")); @@ -181,6 +188,15 @@ public class IntentForwarderActivity extends Activity { return; } + if (launchIntent.getBooleanExtra(EXTRA_SKIP_USER_CONFIRMATION, /* defaultValue= */ false) + && getCallingPackage() != null + && PERMISSION_GRANTED == getPackageManager().checkPermission( + INTERACT_ACROSS_USERS, getCallingPackage())) { + startActivityAsCaller(launchIntent, targetUserId); + finish(); + return; + } + int layoutId = R.layout.miniresolver; setContentView(layoutId); diff --git a/core/java/com/android/internal/util/ContrastColorUtil.java b/core/java/com/android/internal/util/ContrastColorUtil.java index ced272225f48..77de27242e78 100644 --- a/core/java/com/android/internal/util/ContrastColorUtil.java +++ b/core/java/com/android/internal/util/ContrastColorUtil.java @@ -40,6 +40,8 @@ import android.text.style.TextAppearanceSpan; import android.util.Log; import android.util.Pair; +import com.android.internal.annotations.VisibleForTesting; + import java.util.Arrays; import java.util.WeakHashMap; @@ -280,6 +282,92 @@ public class ContrastColorUtil { return charSequence; } + /** + * Ensures contrast on color spans against a background color. + * Note that any full-length color spans will be removed instead of being contrasted. + * + * @param charSequence the charSequence on which the spans are + * @param background the background color to ensure the contrast against + * @return the contrasted charSequence + */ + public static CharSequence ensureColorSpanContrast(CharSequence charSequence, + int background) { + if (charSequence == null) { + return charSequence; + } + if (charSequence instanceof Spanned) { + Spanned ss = (Spanned) charSequence; + Object[] spans = ss.getSpans(0, ss.length(), Object.class); + SpannableStringBuilder builder = new SpannableStringBuilder(ss.toString()); + for (Object span : spans) { + Object resultSpan = span; + int spanStart = ss.getSpanStart(span); + int spanEnd = ss.getSpanEnd(span); + boolean fullLength = (spanEnd - spanStart) == charSequence.length(); + if (resultSpan instanceof CharacterStyle) { + resultSpan = ((CharacterStyle) span).getUnderlying(); + } + if (resultSpan instanceof TextAppearanceSpan) { + TextAppearanceSpan originalSpan = (TextAppearanceSpan) resultSpan; + ColorStateList textColor = originalSpan.getTextColor(); + if (textColor != null) { + if (fullLength) { + // Let's drop the color from the span + textColor = null; + } else { + int[] colors = textColor.getColors(); + int[] newColors = new int[colors.length]; + for (int i = 0; i < newColors.length; i++) { + boolean isBgDark = isColorDark(background); + newColors[i] = ContrastColorUtil.ensureLargeTextContrast( + colors[i], background, isBgDark); + } + textColor = new ColorStateList(textColor.getStates().clone(), + newColors); + } + resultSpan = new TextAppearanceSpan( + originalSpan.getFamily(), + originalSpan.getTextStyle(), + originalSpan.getTextSize(), + textColor, + originalSpan.getLinkTextColor()); + } + } else if (resultSpan instanceof ForegroundColorSpan) { + if (fullLength) { + resultSpan = null; + } else { + ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan; + int foregroundColor = originalSpan.getForegroundColor(); + boolean isBgDark = isColorDark(background); + foregroundColor = ContrastColorUtil.ensureLargeTextContrast( + foregroundColor, background, isBgDark); + resultSpan = new ForegroundColorSpan(foregroundColor); + } + } else { + resultSpan = span; + } + if (resultSpan != null) { + builder.setSpan(resultSpan, spanStart, spanEnd, ss.getSpanFlags(span)); + } + } + return builder; + } + return charSequence; + } + + /** + * Determines if the color is light or dark. Specifically, this is using the same metric as + * {@link ContrastColorUtil#resolvePrimaryColor(Context, int, boolean)} and peers so that + * the direction of color shift is consistent. + * + * @param color the color to check + * @return true if the color has higher contrast with white than black + */ + public static boolean isColorDark(int color) { + // as per shouldUseDark(), this uses the color contrast midpoint. + return calculateLuminance(color) <= 0.17912878474; + } + private int processColor(int color) { return Color.argb(Color.alpha(color), 255 - Color.red(color), diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java index 3c0675504e25..c1445035ca33 100644 --- a/core/java/com/android/internal/util/LatencyTracker.java +++ b/core/java/com/android/internal/util/LatencyTracker.java @@ -35,6 +35,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPOR import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHOW_BACK_ARROW; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHOW_SELECTION_TOOLBAR; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHOW_VOICE_INTERACTION; +import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_START_RECENTS_ANIMATION; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SWITCH_DISPLAY_UNFOLD; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_TOGGLE_RECENTS; @@ -205,6 +206,15 @@ public class LatencyTracker { */ public static final int ACTION_REQUEST_IME_HIDDEN = 21; + /** + * Time it takes to load the animation frames in smart space doorbell card. + * It measures the duration from the images uris are passed into the view + * to all the frames are loaded. + * <p/> + * A long latency makes the doorbell animation looks janky until all the frames are loaded. + */ + public static final int ACTION_SMARTSPACE_DOORBELL = 22; + private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, @@ -228,6 +238,7 @@ public class LatencyTracker { ACTION_SHOW_VOICE_INTERACTION, ACTION_REQUEST_IME_SHOWN, ACTION_REQUEST_IME_HIDDEN, + ACTION_SMARTSPACE_DOORBELL, }; /** @hide */ @@ -254,6 +265,7 @@ public class LatencyTracker { ACTION_SHOW_VOICE_INTERACTION, ACTION_REQUEST_IME_SHOWN, ACTION_REQUEST_IME_HIDDEN, + ACTION_SMARTSPACE_DOORBELL, }) @Retention(RetentionPolicy.SOURCE) public @interface Action { @@ -283,6 +295,7 @@ public class LatencyTracker { UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHOW_VOICE_INTERACTION, UIACTION_LATENCY_REPORTED__ACTION__ACTION_REQUEST_IME_SHOWN, UIACTION_LATENCY_REPORTED__ACTION__ACTION_REQUEST_IME_HIDDEN, + UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL, }; private final Object mLock = new Object(); @@ -407,6 +420,8 @@ public class LatencyTracker { return "ACTION_REQUEST_IME_SHOWN"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_REQUEST_IME_HIDDEN: return "ACTION_REQUEST_IME_HIDDEN"; + case UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL: + return "ACTION_SMARTSPACE_DOORBELL"; default: throw new IllegalArgumentException("Invalid action"); } diff --git a/core/java/com/android/internal/widget/NotificationActionListLayout.java b/core/java/com/android/internal/widget/NotificationActionListLayout.java index 3191e23a9883..302d2e797e74 100644 --- a/core/java/com/android/internal/widget/NotificationActionListLayout.java +++ b/core/java/com/android/internal/widget/NotificationActionListLayout.java @@ -361,13 +361,15 @@ public class NotificationActionListLayout extends LinearLayout { // same padding on bottom and at end int paddingBottom = getResources().getDimensionPixelSize( com.android.internal.R.dimen.notification_content_margin_end); - height = mEmphasizedHeight; int buttonPaddingInternal = getResources().getDimensionPixelSize( com.android.internal.R.dimen.button_inset_vertical_material); setPaddingRelative(getPaddingStart(), paddingTop - buttonPaddingInternal, getPaddingEnd(), paddingBottom - buttonPaddingInternal); + + setMinimumHeight(mEmphasizedHeight); + height = ViewGroup.LayoutParams.WRAP_CONTENT; } else { setPaddingRelative(getPaddingStart(), mDefaultPaddingTop, diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 9e92542bf3a1..a2205eb7dfdb 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -94,6 +94,7 @@ static struct configuration_offsets_t { jfieldID mScreenWidthDpOffset; jfieldID mScreenHeightDpOffset; jfieldID mScreenLayoutOffset; + jfieldID mUiMode; } gConfigurationOffsets; static struct arraymap_offsets_t { @@ -1030,10 +1031,11 @@ static jobject ConstructConfigurationObject(JNIEnv* env, const ResTable_config& env->SetIntField(result, gConfigurationOffsets.mScreenWidthDpOffset, config.screenWidthDp); env->SetIntField(result, gConfigurationOffsets.mScreenHeightDpOffset, config.screenHeightDp); env->SetIntField(result, gConfigurationOffsets.mScreenLayoutOffset, config.screenLayout); + env->SetIntField(result, gConfigurationOffsets.mUiMode, config.uiMode); return result; } -static jobjectArray NativeGetSizeConfigurations(JNIEnv* env, jclass /*clazz*/, jlong ptr) { +static jobjectArray GetSizeAndUiModeConfigurations(JNIEnv* env, jlong ptr) { ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr)); auto configurations = assetmanager->GetResourceConfigurations(true /*exclude_system*/, false /*exclude_mipmap*/); @@ -1060,6 +1062,14 @@ static jobjectArray NativeGetSizeConfigurations(JNIEnv* env, jclass /*clazz*/, j return array; } +static jobjectArray NativeGetSizeConfigurations(JNIEnv* env, jclass /*clazz*/, jlong ptr) { + return GetSizeAndUiModeConfigurations(env, ptr); +} + +static jobjectArray NativeGetSizeAndUiModeConfigurations(JNIEnv* env, jclass /*clazz*/, jlong ptr) { + return GetSizeAndUiModeConfigurations(env, ptr); +} + static jintArray NativeAttributeResolutionStack( JNIEnv* env, jclass /*clazz*/, jlong ptr, jlong theme_ptr, jint xml_style_res, @@ -1494,6 +1504,8 @@ static const JNINativeMethod gAssetManagerMethods[] = { {"nativeGetLocales", "(JZ)[Ljava/lang/String;", (void*)NativeGetLocales}, {"nativeGetSizeConfigurations", "(J)[Landroid/content/res/Configuration;", (void*)NativeGetSizeConfigurations}, + {"nativeGetSizeAndUiModeConfigurations", "(J)[Landroid/content/res/Configuration;", + (void*)NativeGetSizeAndUiModeConfigurations}, // Style attribute related methods. {"nativeAttributeResolutionStack", "(JJIII)[I", (void*)NativeAttributeResolutionStack}, @@ -1572,6 +1584,7 @@ int register_android_content_AssetManager(JNIEnv* env) { GetFieldIDOrDie(env, configurationClass, "screenHeightDp", "I"); gConfigurationOffsets.mScreenLayoutOffset = GetFieldIDOrDie(env, configurationClass, "screenLayout", "I"); + gConfigurationOffsets.mUiMode = GetFieldIDOrDie(env, configurationClass, "uiMode", "I"); jclass arrayMapClass = FindClassOrDie(env, "android/util/ArrayMap"); gArrayMapOffsets.classObject = MakeGlobalRefOrDie(env, arrayMapClass); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4c6272365fcd..12106c7a480e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -821,6 +821,7 @@ <protected-broadcast android:name="android.intent.action.PROFILE_REMOVED" /> <protected-broadcast android:name="com.android.internal.telephony.cat.SMS_SENT_ACTION" /> <protected-broadcast android:name="com.android.internal.telephony.cat.SMS_DELIVERY_ACTION" /> + <protected-broadcast android:name="com.android.internal.telephony.data.ACTION_RETRY" /> <protected-broadcast android:name="android.companion.virtual.action.VIRTUAL_DEVICE_REMOVED" /> <protected-broadcast android:name="com.android.internal.intent.action.FLASH_NOTIFICATION_START_PREVIEW" /> <protected-broadcast android:name="com.android.internal.intent.action.FLASH_NOTIFICATION_STOP_PREVIEW" /> diff --git a/core/res/res/layout/notification_material_action.xml b/core/res/res/layout/notification_material_action.xml index c024dbed56c0..da515d788ce5 100644 --- a/core/res/res/layout/notification_material_action.xml +++ b/core/res/res/layout/notification_material_action.xml @@ -19,7 +19,8 @@ style="@android:style/NotificationAction" android:id="@+id/action0" android:layout_width="wrap_content" - android:layout_height="48dp" + android:layout_height="wrap_content" + android:minHeight="48dp" android:layout_gravity="center" android:gravity="start|center_vertical" android:layout_marginStart="4dp" diff --git a/core/res/res/layout/notification_material_action_emphasized.xml b/core/res/res/layout/notification_material_action_emphasized.xml index ea841851cd44..ac90948c8b12 100644 --- a/core/res/res/layout/notification_material_action_emphasized.xml +++ b/core/res/res/layout/notification_material_action_emphasized.xml @@ -19,7 +19,8 @@ style="@style/NotificationEmphasizedAction" android:id="@+id/action0" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/notification_action_emphasized_height" android:layout_marginStart="12dp" android:drawablePadding="6dp" android:gravity="center" diff --git a/core/res/res/layout/notification_material_action_emphasized_tombstone.xml b/core/res/res/layout/notification_material_action_emphasized_tombstone.xml index 60f10dbcdebc..16ea70c70ec1 100644 --- a/core/res/res/layout/notification_material_action_emphasized_tombstone.xml +++ b/core/res/res/layout/notification_material_action_emphasized_tombstone.xml @@ -20,7 +20,8 @@ style="@style/NotificationEmphasizedAction" android:id="@+id/action0" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/notification_action_emphasized_height" android:layout_marginStart="12dp" android:drawablePadding="6dp" android:enabled="false" diff --git a/core/res/res/layout/notification_material_action_list.xml b/core/res/res/layout/notification_material_action_list.xml index 7aef82a8aa3a..057270aa35df 100644 --- a/core/res/res/layout/notification_material_action_list.xml +++ b/core/res/res/layout/notification_material_action_list.xml @@ -36,7 +36,8 @@ android:id="@+id/actions" android:layout_width="0dp" android:layout_weight="1" - android:layout_height="@dimen/notification_action_list_height" + android:layout_height="wrap_content" + android:minHeight="@dimen/notification_action_list_height" android:orientation="horizontal" android:gravity="center_vertical" android:visibility="gone" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 262fb6f00367..42e5188ac516 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-oproepe"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-fi-oproep"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Af"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Bel oor Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Bel oor mobiele netwerk"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> gebruik tans albei skerms om inhoud te wys"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Toestel is te warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbelskerm is nie beskikbaar nie omdat jou foon tans te warm word"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is nie beskikbaar nie"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is nie beskikbaar nie omdat Batterybespaarder aan is. Jy kan dit in Instellings afskakel."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Gaan na Instellings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Skakel af"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> is opgestel"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Sleutelborduitleg is gestel op <xliff:g id="LAYOUT_1">%s</xliff:g>. Tik om te verander."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index aa01323b4c6c..26f99bfe5ee0 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ይዘትን ለማሳየት ሁለቱንም ማሳያዎች እየተጠቀመ ነው"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"መሣሪያ በጣም ሞቋል"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ስልክዎ በጣም እየሞቀ ስለሆነ ባለሁለት ማያ ገጽ አይገኝም"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen አይገኝም"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"የባትሪ ቆጣቢ ስለበራ Dual Screen አይገኝም። ይህን በቅንብሮች ውስጥ ሊያጠፉት ይችላሉ።"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ወደ ቅንብሮች ሂድ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"አጥፋ"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> ተዋቅሯል"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"የቁልፍ ሰሌዳ ወደ <xliff:g id="LAYOUT_1">%s</xliff:g> ተቀናብሯል። ለመለወጥ መታ ያድርጉ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index ce47a3e922ba..7335043de246 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -144,8 +144,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"الاتصال عبر WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"مكالمة عبر Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"غير مفعّل"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"الاتصال عبر Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"الاتصال عبر شبكة الجوّال"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 07a578b050bd..9be6860d54a3 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"ৱাই-ফাই"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ৱাই-ফাই কলিং"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ৱাই-ফাই কল"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"অফ হৈ আছে"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ৱাই-ফাইৰ জৰিয়তে কল কৰক"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ম’বাইল নেটৱৰ্কৰ জৰিয়তে কল কৰক"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ সমল দেখুৱাবলৈ দুয়োখন ডিছপ্লে’ ব্যৱহাৰ কৰি আছে"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ডিভাইচটো অতি বেছি গৰম হৈছে"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপোনাৰ ফ’নটো অতি বেছি গৰম হোৱাৰ বাবে ডুৱেল স্ক্ৰীন উপলব্ধ নহয়"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen উপলব্ধ নহয়"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"বেটাৰী সঞ্চয়কাৰী অন হৈ থকাৰ কাৰণে Dual Screen সুবিধাটো উপলব্ধ নহয়। আপুনি ছেটিঙত এই সুবিধাটো অফ কৰিব পাৰে।"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ছেটিঙলৈ যাওক"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"অফ কৰক"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> কনফিগাৰ কৰা হৈছে"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"কীব’ৰ্ডৰ লে’আউট <xliff:g id="LAYOUT_1">%s</xliff:g> হিচাপে ছেট কৰা হৈছে। সলনি কৰিবলৈ টিপক।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index a843c7ce40c1..94ceba514ff7 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi Zəngi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi zəngi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Deaktiv"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ilə zəng edin"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil şəbəkə ilə zəng edin"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> məzmunu göstərmək üçün hər iki displeydən istifadə edir"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Cihaz çox isinib"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Telefonunuz çox isindiyi üçün İkili Ekran əlçatan deyil"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen əlçatan deyil"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Enerjiyə Qənaət aktiv olduğu üçün Dual Screen əlçatan deyil. Ayarlarda deaktiv edə bilərsiniz."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ayarlara keçin"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Deaktiv edin"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> konfiqurasiya edilib"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klaviatura düzəni <xliff:g id="LAYOUT_1">%s</xliff:g> kimi ayarlanıb. Dəyişmək üçün toxunun."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 7b99842e3fd3..fa6991f88c79 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Pozivanje preko WiFi-a"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Poziv preko WiFi-ja"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Pozivanje preko WiFi-a"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Poziv preko mobilne mreže"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> koristi oba ekrana za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj je previše zagrejan"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojni ekran je nedostupan jer je telefon previše zagrejan"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nije dostupan"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nije dostupan zato što je Ušteda baterije uključena. To možete da isključite u podešavanjima."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Idi u Podešavanja"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Isključi"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Uređaj <xliff:g id="DEVICE_NAME">%s</xliff:g> je konfigurisan"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Raspored tastature je podešen na <xliff:g id="LAYOUT_1">%s</xliff:g>. Dodirnite da biste to promenili."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 080bf2c3359d..3037acba8144 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-тэлефанія"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWi-Fi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Выклік праз Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Выкл."</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Выклікаць праз Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Выклікаць праз мабільную сетку"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index b2abe40c8be6..a70d59f40a0e 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Обаждания през Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Обаждане през Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Изключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Обаждане през Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Обаждане през мобилна мрежа"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Приложението <xliff:g id="APP_NAME">%1$s</xliff:g> използва и двата екрана, за да показва съдържание"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Устройството е твърде топло"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцията за двоен екран не е налице, защото телефонът ви е твърде топъл"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функцията Dual Screen не е налице"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функцията Dual Screen не е налице, защото режимът за запазване на батерията е включен. Можете да го изключите от настройките."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Към настройките"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Изключване"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Устройството <xliff:g id="DEVICE_NAME">%s</xliff:g> е конфигурирано"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"За клавиатурната подредба е зададен <xliff:g id="LAYOUT_1">%s</xliff:g>. Докоснете за промяна."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 64448fd0e454..16cbc773148a 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"কন্টেন্ট দেখানোর জন্য <xliff:g id="APP_NAME">%1$s</xliff:g> দুটি ডিসপ্লে ব্যবহার করছে"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ডিভাইস খুব গরম হয়ে গেছে"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপনার ফোন খুব বেশি গরম হয়ে যাচ্ছে বলে \'ডুয়াল স্ক্রিন\' উপলভ্য নেই"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen উপলভ্য নেই"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"\'ব্যাটারি সেভার\' চালু করা আছে বলে Dual Screen ফিচারের সুবিধা উপলভ্য হবে না। আপনি সেটিংস থেকে এটি বন্ধ করতে পারবেন।"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"সেটিংসে যান"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"বন্ধ করুন"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> কনফিগার করা হয়েছে"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"কীবোর্ড লেআউট <xliff:g id="LAYOUT_1">%s</xliff:g>-এ সেট করা আছে। পরিবর্তন করতে ট্যাপ করুন।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 1a702aad1d07..0b78d26c71a8 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -141,7 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Pozivanje putem WIFi-ja"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi poziv"</string> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi poziv"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Poziv putem WiFi-ja"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Poziv putem mobilne mreže"</string> @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> koristi oba ekrana za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj je previše zagrijan"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dupli ekran nije dostupan je se telefon previše zagrijava"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nije dostupan"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nije dostupan jer je Ušteda baterije uključena. To možete isključiti u Postavkama."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Idi u Postavke"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Isključi"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Uređaj <xliff:g id="DEVICE_NAME">%s</xliff:g> je konfiguriran"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Raspored tastature je postavljen na <xliff:g id="LAYOUT_1">%s</xliff:g>. Dodirnite da promijenite."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 1fe8f61e2a92..f08cb3a6f156 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi‑Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Trucades per Wi‑Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Trucada per Wifi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Desactivat"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Trucades per Wi‑Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Trucades per la xarxa mòbil"</string> @@ -618,7 +617,7 @@ <string name="permdesc_mediaLocation" msgid="597912899423578138">"Permet que l\'aplicació llegeixi les ubicacions de les teves col·leccions multimèdia."</string> <string name="biometric_app_setting_name" msgid="3339209978734534457">"Utilitza la biometria"</string> <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Fes servir la biometria o el bloqueig de pantalla"</string> - <string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica que ets tu"</string> + <string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica la teva identitat"</string> <string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Utilitza la teva biometria per continuar"</string> <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Utilitza la biometria o el bloqueig de pantalla per continuar"</string> <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Maquinari biomètric no disponible"</string> @@ -1238,7 +1237,7 @@ <string name="screen_compat_mode_scale" msgid="8627359598437527726">"Escala"</string> <string name="screen_compat_mode_show" msgid="5080361367584709857">"Mostra sempre"</string> <string name="screen_compat_mode_hint" msgid="4032272159093750908">"Torna a activar-ho a Configuració del sistema > Aplicacions > Baixades."</string> - <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet la mida de pantalla actual i és possible que funcioni de manera inesperada."</string> + <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet la mida de visualització actual i és possible que funcioni de manera inesperada."</string> <string name="unsupported_display_size_show" msgid="980129850974919375">"Mostra sempre"</string> <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> es va crear per a una versió incompatible del sistema operatiu Android i pot funcionar de manera inesperada. És possible que hi hagi disponible una versió actualitzada de l\'aplicació."</string> <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"Mostra sempre"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> està utilitzant les dues pantalles per mostrar contingut"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"El dispositiu està massa calent"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"La pantalla dual no està disponible perquè el telèfon està massa calent"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen no està disponible"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen no està disponible perquè la funció Estalvi de bateria està activada. Pots desactivar aquesta opció a Configuració."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ves a Configuració"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactiva"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configurat"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Disseny del teclat definit en <xliff:g id="LAYOUT_1">%s</xliff:g>. Toca per canviar-ho."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0ed1dd8472b1..d62434553307 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Volání přes WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Volání přes WiFi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Vypnuto"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Volání přes Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Volání přes mobilní síť"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 3bb53d49e0a3..46269af8a734 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-opkald"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi-opkald"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Fra"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring via mobilnetværk"</string> @@ -1259,7 +1258,7 @@ <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Du har trykket på afbryderknappen, hvilket som regel slukker skærmen.\n\nPrøv at trykke let på knappen, mens du konfigurerer dit fingeraftryk."</string> <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Sluk skærmen for at afslutte konfigurationen"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Deaktiver"</string> - <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vil du bekræfte dit fingeraftryk?"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vil du verificere dit fingeraftryk?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Du har trykket på afbryderknappen, hvilket som regel slukker skærmen.\n\nPrøv at trykke let på knappen for at bekræfte dit fingeraftryk."</string> <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Sluk skærm"</string> <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Fortsæt"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 8530755a666b..afb2c73b09d5 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WLAN"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WLAN-Telefonie"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WLAN-Anruf"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Aus"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Anruf über WLAN"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Über Mobilfunknetz anrufen"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> nutzt zum Anzeigen von Inhalten beide Displays"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Gerät ist zu warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ist nicht verfügbar, weil dein Smartphone zu warm ist"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ist nicht verfügbar"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ist nicht verfügbar, weil der Energiesparmodus aktiviert ist. Dies lässt sich in den Einstellungen deaktivieren."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Zu den Einstellungen"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Deaktivieren"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> konfiguriert"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Tastaturlayout festgelegt auf <xliff:g id="LAYOUT_1">%s</xliff:g>. Zum Ändern tippen."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 28b269bd089e..fd20378ab2aa 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> χρησιμοποιεί και τις δύο οθόνες για να εμφανίζει περιεχόμενο"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Η θερμοκρασία της συσκευής είναι πολύ υψηλή"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Η λειτουργία διπλής οθόνης δεν είναι διαθέσιμη επειδή η θερμοκρασία του τηλεφώνου αυξάνεται υπερβολικά"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Το Dual Screen δεν είναι διαθέσιμο"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Το Dual Screen δεν είναι διαθέσιμο επειδή η Εξοικονόμηση μπαταρίας είναι ενεργοποιημένη. Μπορείτε να απενεργοποιήσετε αυτήν τη λειτουργία στις Ρυθμίσεις."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Μεταβείτε στις Ρυθμίσεις"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Απενεργοποίηση"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Η συσκευή <xliff:g id="DEVICE_NAME">%s</xliff:g> διαμορφώθηκε"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Η διάταξη πληκτρολογίου ορίστηκε σε <xliff:g id="LAYOUT_1">%s</xliff:g>. Πατήστε για αλλαγή."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 4996e4f904f4..3cee375c5cbb 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using both displays to show content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Device is too warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is unavailable because your phone is getting too warm"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is unavailable"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is unavailable because Battery Saver is on. You can turn this off in Settings."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Go to Settings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Turn off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configured"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Keyboard layout set to <xliff:g id="LAYOUT_1">%s</xliff:g>. Tap to change."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 597569c39754..311c8a3bbbf8 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -1702,7 +1702,7 @@ <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"View and control screen"</string> <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"It can read all content on the screen and display content over other apps."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"View and perform actions"</string> - <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"It can track your interactions with an app or a hardware sensor, and interact with apps on your behalf."</string> + <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"It can track your interactions with an app or a hardware sensor and interact with apps on your behalf."</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Allow"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Deny"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tap a feature to start using it:"</string> @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using both displays to show content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Device is too warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is unavailable because your phone is getting too warm"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is unavailable"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is unavailable because Battery Saver is on. You can turn this off in Settings."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Go to Settings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Turn off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configured"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Keyboard layout set to <xliff:g id="LAYOUT_1">%s</xliff:g>. Tap to change."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 76fdcef80a34..9c97a49ef989 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using both displays to show content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Device is too warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is unavailable because your phone is getting too warm"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is unavailable"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is unavailable because Battery Saver is on. You can turn this off in Settings."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Go to Settings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Turn off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configured"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Keyboard layout set to <xliff:g id="LAYOUT_1">%s</xliff:g>. Tap to change."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 45afefcdd487..86be1a96bbfa 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using both displays to show content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Device is too warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is unavailable because your phone is getting too warm"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is unavailable"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is unavailable because Battery Saver is on. You can turn this off in Settings."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Go to Settings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Turn off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configured"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Keyboard layout set to <xliff:g id="LAYOUT_1">%s</xliff:g>. Tap to change."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 6c57327cfa20..44426d708052 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> is using both displays to show content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Device is too warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is unavailable because your phone is getting too warm"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is unavailable"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is unavailable because Battery Saver is on. You can turn this off in Settings."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Go to Settings"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Turn off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configured"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Keyboard layout set to <xliff:g id="LAYOUT_1">%s</xliff:g>. Tap to change."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index b221b9e5c20e..9d06e1511600 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi‑Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Llamada por Wi‑Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWiFi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Llamada Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Llamar a través de la red Wi‑Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Llamar a través de la red móvil"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> está usando ambas pantallas para mostrar contenido"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"El dispositivo está demasiado caliente"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Cámara Dual no está disponible porque el teléfono se está calentando demasiado"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen no está disponible"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen no está disponible porque la función Ahorro de batería está activada. Puedes desactivarla en Ajustes."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir a Ajustes"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactivar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Se ha configurado <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%s</xliff:g>. Toca para cambiarlo."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index f4f3c4ddafd2..78f574936a1e 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi-kõned"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi-kõne"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Väljas"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Helista WiFi kaudu"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Helista mobiilsidevõrgu kaudu"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> kasutab sisu kuvamiseks mõlemat ekraani"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Seade on liiga kuum"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kahe ekraani režiim pole saadaval, kuna teie telefon läheb liiga kuumaks"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Kahe ekraani režiim ei ole saadaval"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kahe ekraani režiim ei ole saadaval, kuna akusäästja on sisse lülitatud. Saate selle seadetes välja lülitada."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ava seaded"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Lülita välja"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> on seadistatud"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klaviatuuripaigutuseks on määratud <xliff:g id="LAYOUT_1">%s</xliff:g>. Puudutage muutmiseks."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 3ca55e2e3cf2..53644927cba7 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wifia"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi bidezko deiak"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wifi bidezko deia"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Desaktibatuta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Deitu wifi bidez"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Deitu sare mugikorraren bidez"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> bi pantailak erabiltzen ari da edukia erakusteko"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Gailua beroegi dago"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Bi pantailako modua ez dago erabilgarri telefonoa berotzen ari delako"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ez dago erabilgarri"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ez dago erabilgarri, bateria-aurreztailea aktibatuta dagoelako. Aukera hori desaktibatzeko, joan ezarpenetara."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Joan Ezarpenak atalera"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desaktibatu"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Konfiguratu da <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Ezarri da <xliff:g id="LAYOUT_1">%s</xliff:g> gisa teklatuaren diseinua. Diseinu hori aldatzeko, sakatu hau."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5473cec93daa..88dd3a6eebf8 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"تماس ازطریق WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"تماس Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"خاموش"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"تماس ازطریق Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"تماس ازطریق شبکه تلفن همراه"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> از هر دو نمایشگر برای نمایش محتوا استفاده میکند"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"دستگاه بیشازحد گرم شده است"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"«صفحه دوتایی» دردسترس نیست زیرا تلفن بیشازحد گرم شده است"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen دردسترس نیست"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen دردسترس نیست چون «بهینهسازی باتری» روشن است. میتوانید این ویژگی را در «تنظیمات» خاموش کنید."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"رفتن به تنظیمات"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"خاموش کردن"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> پیکربندی شد"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"طرحبندی صفحهکلید روی <xliff:g id="LAYOUT_1">%s</xliff:g> تنظیم شد. برای تغییر دادن، ضربه بزنید."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 9ec3fbaf0adf..f007d74ad484 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-puhelut"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi-puhelu"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Ei päällä"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Soita Wi-Fin kautta"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Soita mobiiliverkon kautta"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 04597fa0d644..409f5a2c4ebe 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Appels Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"Voix par Wi-Fi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Appel Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Appels par Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Appels sur réseau cellulaire"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index ff74083bba45..7de81a536505 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Appels Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWiFi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Appel Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Appel via le Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Appel via le réseau mobile"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> utilise les deux écrans pour afficher du contenu"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"L\'appareil est trop chaud"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Double écran n\'est pas disponible, car votre téléphone surchauffe"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Double écran n\'est pas disponible"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Double écran n\'est pas disponible, car Économiseur de batterie est activé. Vous pouvez désactiver cette option dans les paramètres."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Accédez aux paramètres"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Désactiver"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configuré"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Disposition du clavier définie sur <xliff:g id="LAYOUT_1">%s</xliff:g>. Appuyez pour la modifier."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 1f86aa5923b5..d748991f41e9 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wifi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Chamadas por wifi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Chamada por wifi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chama por wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chama pola rede de telefonía móbil"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 1122ce74650e..53d7fd813545 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"વાઇ-ફાઇ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"વાઇ-ફાઇ કૉલિંગ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"વાઇ ફાઇ કૉલ"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"બંધ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"વાઇ-ફાઇ પરથી કૉલ કરો"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"મોબાઇલ નેટવર્ક પરથી કૉલ કરો"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"કન્ટેન્ટ બતાવવા માટે <xliff:g id="APP_NAME">%1$s</xliff:g> બન્ને ડિસ્પ્લેનો ઉપયોગ કરી રહી છે"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ડિવાઇસ ખૂબ જ ગરમ છે"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે કારણ કે તમારો ફોન ખૂબ જ ગરમ થઈ રહ્યો છે"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"બૅટરી સેવર ચાલુ હોવાને કારણે ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે. તમે સેટિંગમાં જઈને આને બંધ કરી શકો છો."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"સેટિંગ પર જાઓ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"બંધ કરો"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>ની ગોઠવણી કરવામાં આવી છે"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"કીબોર્ડનું લેઆઉટ <xliff:g id="LAYOUT_1">%s</xliff:g> પર સેટ કરવામાં આવ્યું છે. બદલવા માટે ટૅપ કરો."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 2fe9a2954e9b..84f0490cd00a 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"वाई-फ़ाई"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"वाई-फ़ाई कॉलिंग"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"वाई-फ़ाई कॉल"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"बंद"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"वाई-फ़ाई के ज़रिए कॉल करें"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्क के ज़रिए कॉल"</string> @@ -1701,7 +1700,7 @@ <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> को अपना डिवाइस पूरी तरह कंट्रोल करने की मंज़ूरी दें?"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"पूरी तरह कंट्रोल करने की अनुमति उन ऐप्लिकेशन के लिए ठीक है जो सुलभता से जुड़ी ज़रूरतों के लिए बने हैं, लेकिन ज़्यादातर ऐप्लिकेशन के लिए यह ठीक नहीं है."</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"स्क्रीन को देखें और कंट्रोल करें"</string> - <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"यह स्क्रीन पर दिखने वाली हर तरह के कॉन्टेंट को पढ़ सकता है और उसे दूसरे ऐप्लिकेशन पर दिखा सकता है."</string> + <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"यह स्क्रीन पर दिखने वाले कॉन्टेंट को पढ़ सकता है और उसे दूसरे ऐप्लिकेशन के ऊपर दिखा सकता है."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"देखें और कार्रवाई करें"</string> <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"यह आपके और किसी ऐप्लिकेशन या हार्डवेयर सेंसर के बीच होने वाले इंटरैक्शन को ट्रैक कर सकता है और आपकी तरफ़ से ऐप्लिकेशन के साथ इंटरैक्ट कर सकता है."</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमति दें"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>, कॉन्टेंट दिखाने के लिए दोनों डिसप्ले का इस्तेमाल कर रहा है"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"आपका फ़ोन बहुत गर्म हो गया है"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ड्यूअल स्क्रीन की सुविधा अभी उपलब्ध नहीं है, क्योंकि आपका फ़ोन बहुत गर्म हो रहा है"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen का इस्तेमाल नहीं किया जा सकता"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"बैटरी सेवर की सुविधा चालू होने पर, Dual Screen का इस्तेमाल नहीं किया जा सकता. इस सुविधा को सेटिंग में जाकर बंद करें."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिंग पर जाएं"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"बंद करें"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> कॉन्फ़िगर किया गया"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"कीबोर्ड का लेआउट <xliff:g id="LAYOUT_1">%s</xliff:g> पर सेट कर दिया गया है. बदलने के लिए टैप करें."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 5bdbd1edabf3..eff55241e17b 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> upotrebljava oba zaslona za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj se pregrijao"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvostruki zaslon nije podržan jer se vaš telefon pregrijao"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Značajka Dual Screen nije dostupna"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Značajka Dual Screen nije dostupna jer je uključena štednja baterije. To možete isključiti u postavkama."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Otvorite Postavke"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Isključi"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Konfiguriran je uređaj <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Raspored tipkovnice postavljen je na <xliff:g id="LAYOUT_1">%s</xliff:g>. Dodirnite da biste ga promijenili."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 6f996e52328d..e61aba4400d7 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-hívás"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi-hívás"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Ki"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Hívás Wi-Fi-hálózaton"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Hívás mobilhálózaton"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> mindkét kijelzőt használja a tartalmak megjelenítésére"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Az eszköz túl meleg"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A Két képernyő funkció nem áll rendelkezésre, mert a telefon melegedni kezdett"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"A Két képernyő funkció nem használható"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"A Két képernyő funkció nem használható, mert az Akkumulátorkímélő mód be van kapcsolva. Ezt a funkciót a beállítások között lehet kikapcsolni."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Lépjen a Beállítások menübe"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Kikapcsolás"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> beállítva"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"A billentyűzetkiosztás a következőre van beállítva: <xliff:g id="LAYOUT_1">%s</xliff:g>. A módosításhoz koppintson."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index f1004de11679..b1e226e70a04 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Զանգեր Wi-Fi-ի միջոցով"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Զանգ Wi-Fi-ի միջոցով"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Անջատված է"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Զանգ Wi-Fi-ի միջոցով"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Զանգ բջջային ցանցի միջոցով"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 150629f5bfe4..ca97e22003c1 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Panggilan WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Panggilan Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Nonaktif"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Panggilan telepon melalui Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Panggilan telepon melalui jaringan seluler"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> menggunakan kedua layar untuk menampilkan konten"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Suhu perangkat terlalu panas"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Layar ganda tidak tersedia karena suhu ponsel terlalu panas"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen tidak tersedia"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen tidak tersedia karena Penghemat Baterai aktif. Anda dapat menonaktifkannya di Setelan."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Buka Setelan"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Nonaktifkan"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> telah dikonfigurasi"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Tata letak keyboard disetel ke <xliff:g id="LAYOUT_1">%s</xliff:g>. Ketuk untuk mengubah."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 10b754910768..77ade619be38 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi símtöl"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi-símtal"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Slökkt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Hringja í gegnum Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Hringja í gegnum farsímakerfi"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> er að nota báða skjái til að sýna efni"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Tækið er of heitt"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Tveir skjáir eru ekki í boði vegna þess að síminn er of heitur"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen er ekki í boði"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen er ekki í boði vegna þess að kveikt er á rafhlöðusparnaði. Þú getur slökkt á þessu í stillingunum."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Opna stillingar"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Slökkva"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> er stillt"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Lyklaskipan er stillt á <xliff:g id="LAYOUT_1">%s</xliff:g>. Ýttu til að breyta."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 8cae14deb0eb..8d57810320f4 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1701,7 +1701,7 @@ <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Vuoi consentire a <xliff:g id="SERVICE">%1$s</xliff:g> di avere il controllo totale del tuo dispositivo?"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"Il controllo totale è appropriato per le app che rispondono alle tue esigenze di accessibilità, ma non per gran parte delle app."</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Visualizzare e controllare lo schermo"</string> - <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Può leggere i contenuti presenti sullo schermo e mostrare i contenuti su altre app."</string> + <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Può leggere tutti i contenuti presenti sullo schermo e mostrare i contenuti sopra altre app."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Visualizzare ed eseguire azioni"</string> <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Può tenere traccia delle tue interazioni con un\'app o un sensore hardware e interagire con app per tuo conto."</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Consenti"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index aa81d6af2624..9e283fa55488 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"שיחות Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"שיחת WiFi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"כבוי"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"שיחה בחיבור Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"שיחה ברשת סלולרית"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> משתמשת בשני המסכים כדי להציג תוכן"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"המכשיר חם מדי"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"מצב שני מסכים לא זמין כי הטלפון נהיה חם מדי"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"התכונה Dual Screen לא זמינה"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"התכונה Dual Screen לא זמינה כי מצב החיסכון בסוללה מופעל. אפשר להשבית את האפשרות הזו בהגדרות."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"מעבר להגדרות"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"השבתה"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"המקלדת <xliff:g id="DEVICE_NAME">%s</xliff:g> הוגדרה"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"פריסת המקלדת מוגדרת ל<xliff:g id="LAYOUT_1">%s</xliff:g>. אפשר להקיש כדי לשנות את ההגדרה הזו."</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 7fdb8d91a3be..af735eaf87d2 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> იყენებს ორივე ეკრანს შინაარსის საჩვენებლად"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"მოწყობილობა ძალიან თბილია"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ორმაგი ეკრანი მიუწვდომელია, რადგან თქვენი ტელეფონი ძალიან თბება"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen მიუწვდომელია"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen მიუწვდომელია, რადგან ჩართულია ბატარეის დამზოგი. ამის გამორთვა პარამეტრებიდან შეგიძლიათ."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"პარამეტრებზე გადასვლა"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"გამორთვა"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> კონფიგურირებულია"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"დაყენდა კლავიატურის განლაგება: <xliff:g id="LAYOUT_1">%s</xliff:g>. შეეხეთ შესაცვლელად."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 32e3f592f1f0..5fbe915558f7 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi қоңыраулары"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi қоңырауы"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Өшірулі"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi арқылы қоңырау шалу"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобильдік желі арқылы қоңырау шалу"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы контентті көрсету үшін екі дисплейді де пайдаланады."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Құрылғы қатты қызып кетті."</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Қос экран функциясы істемейді, себебі телефон қатты қызып кетеді."</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen қолжетімсіз"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Батареяны үнемдеу режимі қосулы болғандықтан, Dual Screen қолжетімсіз. Мұны параметрлерден өшіруге болады."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Параметрлерге өту"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Өшіру"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> конфигурацияланды"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Пернетақта форматы <xliff:g id="LAYOUT_1">%s</xliff:g> деп орнатылды. Өзгерту үшін түртіңіз."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 1f72495b066d..f69ff8adf68e 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ការហៅតាម Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ការហៅទូរសព្ទតាម Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"បិទ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ហៅទូរសព្ទតាមរយៈ Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ហៅទូរសព្ទតាមរយៈបណ្តាញទូរសព្ទចល័ត"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងប្រើផ្ទាំងអេក្រង់ទាំងពីរដើម្បីបង្ហាញខ្លឹមសារ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ឧបករណ៍ក្តៅពេក"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"អេក្រង់ពីរមិនអាចប្រើបានទេ ដោយសារទូរសព្ទរបស់អ្នកឡើងក្តៅពេក"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"មិនអាចប្រើ Dual Screen បានទេ"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"មិនអាចប្រើ Dual Screen បានទេ ដោយសារមុខងារសន្សំថ្មត្រូវបានបើក។ អ្នកអាចបិទវាបាននៅក្នុងការកំណត់។"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ចូលទៅកាន់ \"ការកំណត់\""</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"បិទ"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"បានកំណត់រចនាសម្ព័ន្ធ <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"បានកំណត់ប្លង់ក្ដារចុចទៅ <xliff:g id="LAYOUT_1">%s</xliff:g>។ សូមចុចដើម្បីប្ដូរ។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 062cc67800c5..b503d6bc649f 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"ವೈ-ಫೈ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ವೈಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ವೈ-ಫೈ ಕರೆ"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ಆಫ್"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ವೈ-ಫೈ ಬಳಸಿ ಕರೆ ಮಾಡಿ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಬಳಸಿ ಕರೆ ಮಾಡಿ"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"ವಿಷಯವನ್ನು ತೋರಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಎರಡೂ ಡಿಸ್ಪ್ಲೇಗಳನ್ನು ಬಳಸುತ್ತದೆ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ಸಾಧನವು ತುಂಬಾ ಬಿಸಿಯಾಗಿದೆ"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗುವುದರಿಂದ ಡ್ಯೂಯಲ್ ಸ್ಕ್ರೀನ್ ಲಭ್ಯವಿಲ್ಲ"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಆಗಿರುವ ಕಾರಣ Dual Screen ಲಭ್ಯವಿಲ್ಲ. ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಇದನ್ನು ಆಫ್ ಮಾಡಬಹುದು."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ಆಫ್ ಮಾಡಿ"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಅನ್ನು <xliff:g id="LAYOUT_1">%s</xliff:g> ಗೆ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5a982e575243..78dd9ec06e2d 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi 통화"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi 통화"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"꺼짐"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi를 통해 통화"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"모바일 네트워크를 통해 통화"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 두 화면을 모두 사용하여 콘텐츠를 표시합니다."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"기기 온도가 너무 높음"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"휴대전화 온도가 너무 높아지고 있으므로 듀얼 스크린을 사용할 수 없습니다."</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen을 사용할 수 없음"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"절전 모드가 사용 설정되어 있어 Dual Screen을 사용할 수 없습니다. 설정에서 이 기능을 사용 중지할 수 있습니다."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"설정으로 이동"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"사용 중지"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>에 설정 완료됨"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"키보드 레이아웃이 <xliff:g id="LAYOUT_1">%s</xliff:g>(으)로 설정됩니다. 변경하려면 탭하세요."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 48c2c7b0dfd2..5e3e3d993c4b 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi‑Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi аркылуу чалынууда"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi аркылуу чалуу"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Өчүк"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi аркылуу чалуу"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобилдик тармак аркылуу чалуу"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> контентти эки түзмөктө тең көрсөтүүдө"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Түзмөк ысып кетти"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Телефонуңуз ысып кеткендиктен, Кош экран функциясы жеткиликсиз"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen жеткиликсиз"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen жеткиликсиз, анткени Батареяны үнөмдөгүч режими күйүк. Муну параметрлерден өчүрсөңүз болот."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Параметрлерге өтүү"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Өчүрүү"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> конфигурацияланды"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Баскычтоп калыбы төмөнкүгө коюлду: <xliff:g id="LAYOUT_1">%s</xliff:g>. Өзгөртүү үчүн басыңыз."</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 5b6781469fd9..700940d1556b 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ການໂທ Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ການໂທ Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ປິດ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ໂທຜ່ານ Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ໂທຜ່ານເຄືອຂ່າຍມືຖື"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງໃຊ້ຈໍສະແດງຜົນທັງສອງເພື່ອສະແດງເນື້ອຫາ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ອຸປະກອນຮ້ອນເກີນໄປ"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ໜ້າຈໍຄູ່ບໍ່ພ້ອມໃຫ້ນຳໃຊ້ເນື່ອງຈາກໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ໃຊ້ບໍ່ໄດ້"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ໃຊ້ບໍ່ໄດ້ເນື່ອງຈາກເປີດຕົວປະຢັດແບັດເຕີຣີຢູ່. ທ່ານສາມາດປິດສິ່ງນີ້ໄດ້ໃນການຕັ້ງຄ່າ."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ເຂົ້າໄປການຕັ້ງຄ່າ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ປິດໄວ້"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"ຕັ້ງຄ່າ <xliff:g id="DEVICE_NAME">%s</xliff:g> ແລ້ວ"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"ຕັ້ງຄ່າໂຄງຮ່າງແປ້ນພິມເປັນ <xliff:g id="LAYOUT_1">%s</xliff:g>. ແຕະເພື່ອປ່ຽນ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 6793454a9d22..86b890398c8a 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"„Wi-Fi“ skambinimas"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"„Wi-Fi“ skambutis"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Išjungta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Skambinimas naudojant „Wi-Fi“"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Skambinimas naudojant mobiliojo ryšio tinklą"</string> @@ -2327,12 +2326,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ naudoja abu ekranus turiniui rodyti"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Įrenginys per daug kaista"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvigubas ekranas nepasiekiamas, nes telefonas per daug kaista"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkcija „Dual Screen“ nepasiekiama"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkcija „Dual Screen“ nepasiekiama, nes įjungta Akumuliatoriaus tausojimo priemonė. Šią parinktį bet kada galite išjungti skiltyje „Nustatymai“."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Eiti į skiltį „Nustatymai“"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Išjungti"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Įrenginys „<xliff:g id="DEVICE_NAME">%s</xliff:g>“ sukonfigūruotas"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klaviatūros išdėstymas nustatytas į <xliff:g id="LAYOUT_1">%s</xliff:g>. Palieskite, kad pakeistumėte."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 56f22417e888..123e43aec85b 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi zvani"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi zvans"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Izslēgts"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Zvani Wi-Fi tīklā"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Zvani mobilajā tīklā"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> satura rādīšanai izmanto abus displejus."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Ierīce ir pārāk sakarsusi"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Divu ekrānu režīms nav pieejams, jo tālrunis sāk pārāk sakarst."</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Divu ekrānu režīms nav pieejams"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Divu ekrānu režīms nav pieejams, jo ir ieslēgts akumulatora enerģijas taupīšanas režīms. To var izslēgt iestatījumos."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Atvērt iestatījumus"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Izslēgt"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> ir konfigurēta"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Ir iestatīts šāds tastatūras izkārtojums: <xliff:g id="LAYOUT_1">%s</xliff:g>. Lai to mainītu, pieskarieties."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 1002bdfa8ed1..746f06fc1b70 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Повикување преку Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"Глас преку Wi-Fi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Повик преку WiFi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Исклучено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Повикувај преку Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Повикувај преку мобилна мрежа"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ги користи двата екрани за да прикажува содржини"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Уредот е претопол"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двојниот екран е недостапен бидејќи вашиот телефон станува претопол"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"„Двојниот екран“ е недостапен"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Двојниот екран е недостапен бидејќи е вклучен „Штедач на батерија“. Ова може да се исклучи во „Поставки“."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Одете во „Поставките“"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Исклучи"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> е конфигуриран"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Распоредот на тастатурата е поставен на <xliff:g id="LAYOUT_1">%s</xliff:g>. Допрете за да промените."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 7e08328a5a61..69c96f3c320f 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"വൈഫൈ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"വൈഫൈ കോളിംഗ്"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"Voവൈഫൈ"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"വൈഫൈ കോൾ"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ഓഫ്"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"വൈഫൈ മുഖേനയുള്ള കോൾ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"മൊബൈൽ നെറ്റ്വർക്ക് മുഖേനയുള്ള കോൾ"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"ഉള്ളടക്കം കാണിക്കാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> രണ്ട് ഡിസ്പ്ലേകളും ഉപയോഗിക്കുന്നു"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ഉപകരണത്തിന് ചൂട് കൂടുതലാണ്"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"നിങ്ങളുടെ ഫോൺ വളരെയധികം ചൂടാകുന്നതിനാൽ ഡ്യുവൽ സ്ക്രീൻ ലഭ്യമല്ല"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ഡ്യുവൽ സ്ക്രീൻ ലഭ്യമല്ല"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ബാറ്ററി ലാഭിക്കൽ ഓണായതിനാൽ ഡ്യുവൽ സ്ക്രീൻ ലഭ്യമല്ല. നിങ്ങൾക്ക് ഇത് ക്രമീകരണത്തിൽ ഓഫാക്കാം."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ക്രമീകരണത്തിലേക്ക് പോകുക"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ഓഫാക്കുക"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> കോൺഫിഗർ ചെയ്തു"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"കീബോർഡ് ലേഔട്ട് ആയി <xliff:g id="LAYOUT_1">%s</xliff:g> സജ്ജീകരിച്ചു. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index b83f9fdea50a..18aa7bc40d4d 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi дуудлага"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi дуудлага"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Идэвхгүй"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi-р залгах"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Мобайл сүлжээгээр дуудлага хийх"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> контент харуулахын тулд хоёр дэлгэцийг хоёуланг нь ашиглаж байна"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Төхөөрөмж хэт халуун байна"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Таны утас хэт халж байгаа тул Хоёр дэлгэц боломжгүй байна"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen боломжгүй байна"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Батарей хэмнэгч асаалттай байгаа тул Dual Screen боломжгүй байна. Та үүнийг Тохиргоонд унтрааж болно."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Тохиргоо руу очих"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Унтраах"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>-г тохируулсан"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Гарын бүдүүвчийг <xliff:g id="LAYOUT_1">%s</xliff:g> болгож тохируулсан. Өөрчлөхийн тулд товшино уу."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 4da7c71ce400..e1b45f923b0d 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -627,11 +627,11 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"एरर ऑथेंटिकेट करत आहे"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"स्क्रीन लॉक वापरा"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"पुढे सुरू ठेवण्यासाठी तुमचे स्क्रीन लॉक एंटर करा"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"सेन्सरवर जोरात दाबा"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"सेन्सरवर जोरात प्रेस करा"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"फिंगरप्रिंट ओळखता आली नाही. पुन्हा प्रयत्न करा."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"फिंगरप्रिंट सेन्सर स्वच्छ करा आणि पुन्हा प्रयत्न करा"</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"सेन्सर स्वच्छ करा आणि पुन्हा प्रयत्न करा"</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"सेन्सरवर जोरात दाबा"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"सेन्सरवर जोरात प्रेस करा"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"बोट खूप सावकाश हलविले. कृपया पुन्हा प्रयत्न करा."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"दुसरी फिंगरप्रिंट वापरून पहा"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"खूप प्रखर"</string> @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"आशय दाखवण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> दोन्ही डिस्प्ले वापरत आहे"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"डिव्हाइस खूप गरम आहे"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तुमचा फोन खूप गरम होत असल्यामुळे ड्युअल स्क्रीन उपलब्ध नाही"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ड्युअल स्क्रीन उपलब्ध नाही"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"बॅटरी सेव्हर सुरू असल्यामुळे ड्युअल स्क्रीन उपलब्ध नाही. तुम्ही हे सेटिंग्ज मध्ये बंद करू शकता."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिंग्ज वर जा"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"बंद करा"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> कॉंफिगर केले आहे"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"कीबोर्ड लेआउट <xliff:g id="LAYOUT_1">%s</xliff:g> वर सेट केला. बदलण्यासाठी टॅप करा."</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index d780cbaad3a3..faf3b0c6ddc1 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Panggilan Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Panggilan Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Mati"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Panggil melalui Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Panggil melalui rangkaian mudah alih"</string> @@ -2030,7 +2029,7 @@ <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Kemas kini <xliff:g id="TYPE_0">%1$s</xliff:g> dan <xliff:g id="TYPE_1">%2$s</xliff:g> dalam "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Kemas kini item ini dalam "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> dan <xliff:g id="TYPE_2">%3$s</xliff:g> ?"</string> <string name="autofill_save_yes" msgid="8035743017382012850">"Simpan"</string> - <string name="autofill_save_no" msgid="9212826374207023544">"Tidak, terima kasih"</string> + <string name="autofill_save_no" msgid="9212826374207023544">"Tidak perlu"</string> <string name="autofill_save_notnow" msgid="2853932672029024195">"Bukan sekarang"</string> <string name="autofill_save_never" msgid="6821841919831402526">"Jangan"</string> <string name="autofill_update_yes" msgid="4608662968996874445">"Kemas kini"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> menggunakan kedua-dua paparan untuk menunjukkan kandungan"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Peranti terlalu panas"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dwiskrin tidak tersedia kerana telefon anda terlalu panas"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen tidak tersedia"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen tidak tersedia kerana Penjimat Bateri dihidupkan. Anda boleh mematikan ciri ini dalam Tetapan."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Akses Tetapan"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Matikan"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> dikonfigurasikan"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Reka letak papan kekunci ditetapkan kepada <xliff:g id="LAYOUT_1">%s</xliff:g>. Ketik untuk menukar reka letak."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 9a726790beb0..da4ff15baa3f 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi ခေါ်ဆိုမှု"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi ခေါ်ဆိုမှု"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ပိတ်"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi သုံး၍ ခေါ်ဆိုသည်"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"မိုဘိုင်းကွန်ရက်သုံး၍ ခေါ်ဆိုသည်"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အကြောင်းအရာကို ဖန်သားပြင်နှစ်ခုစလုံးတွင် ပြနေသည်"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"စက်ပစ္စည်း အလွန်ပူနေသည်"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"သင့်ဖုန်း အလွန်ပူနေသဖြင့် ‘စခရင်နှစ်ခု’ သုံး၍မရပါ"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen သုံး၍မရပါ"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"‘ဘက်ထရီ အားထိန်း’ ဖွင့်ထားသဖြင့် Dual Screen သုံး၍မရပါ။ ၎င်းကို ဆက်တင်များတွင် ပိတ်နိုင်သည်။"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ဆက်တင်များသို့ သွားရန်"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ပိတ်ရန်"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> စီစဉ်သတ်မှတ်ထားသည်"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"ကီးဘုတ်အပြင်အဆင်ကို <xliff:g id="LAYOUT_1">%s</xliff:g> ဟု သတ်မှတ်ထားသည်။ ပြောင်းရန်တို့ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 979d4647964f..2f59013107a2 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wifi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wifi-anrop"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wifi-anrop"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via Wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring over mobilnettverk"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 886b27ceec34..52775d00fcb2 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi कलिङ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi कल"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"अफ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi मार्फत कल गर्नुहोस्"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्कमार्फत कल गर्नुहोस्"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले सामग्री देखाउन दुई वटै डिस्प्ले प्रयोग गरिरहेको छ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"डिभाइस ज्यादै तातेको छ"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तपाईंको फोन ज्यादै तातिरहेको हुनाले डुअल स्क्रिन उपलब्ध छैन"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen उपलब्ध छैन"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ब्याट्री सेभर अन भएकाले Dual Screen उपलब्ध छैन। तपाईं सेटिङमा गई यो सुविधा अफ गर्न सक्नुहुन्छ।"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिङमा जानुहोस्"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"अफ गर्नुहोस्"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> कन्फिगर गरिएको छ"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"किबोर्ड लेआउट सेट गरी <xliff:g id="LAYOUT_1">%s</xliff:g> बनाइएको छ। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 97d277d2732e..64ae8147646b 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wifi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Bellen via wifi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wifi-gesprek"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Uit"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Bellen via wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Bellen via mobiel netwerk"</string> @@ -1701,9 +1700,9 @@ <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Toestaan dat <xliff:g id="SERVICE">%1$s</xliff:g> volledige controle over je apparaat heeft?"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"Volledige controle is gepast voor apps die je helpen met toegankelijkheid, maar niet voor de meeste apps."</string> <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Scherm bekijken en bedienen"</string> - <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"De functie kan alle content op het scherm lezen en content bovenop andere apps weergeven."</string> + <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Deze functie kan alle content op het scherm lezen en content bovenop andere apps weergeven."</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Acties bekijken en uitvoeren"</string> - <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"De functie kan je interacties met een app of een hardwaresensor bijhouden en namens jou met apps communiceren."</string> + <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Deze functie kan je interacties met een app of een hardwaresensor bijhouden en namens jou met apps communiceren."</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Toestaan"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Weigeren"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tik op een functie om deze te gebruiken:"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> gebruikt beide schermen om content te tonen"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Het apparaat is te warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbel scherm is niet beschikbaar, omdat je telefoon te warm wordt"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is niet beschikbaar"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is niet beschikbaar omdat Batterijbesparing aanstaat. Je kunt dit uitzetten via Instellingen."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Naar Instellingen"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Uitzetten"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> is ingesteld"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Toetsenbordindeling ingesteld op <xliff:g id="LAYOUT_1">%s</xliff:g>. Tik om te wijzigen."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index bc28604afbfa..09ae2629379b 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"ୱାଇ-ଫାଇ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ୱାଇଫାଇ କଲିଂ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ୱାଇଫାଇ କଲ"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ବନ୍ଦ ଅଛି"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ମୋବାଇଲ ନେଟ୍ୱର୍କ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"ବିଷୟବସ୍ତୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଉଭୟ ଡିସପ୍ଲେକୁ ବ୍ୟବହାର କରୁଛି"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ଡିଭାଇସ ବହୁତ ଗରମ ଅଛି"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ଆପଣଙ୍କ ଫୋନ ବହୁତ ଗରମ ହେଉଥିବା ଯୋଗୁଁ ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ବେଟେରୀ ସେଭର ଚାଲୁ ଥିବା ଯୋଗୁଁ ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ। ଆପଣ ସେଟିଂସରେ ଏହାକୁ ବନ୍ଦ କରିପାରିବେ।"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ସେଟିଂସକୁ ଯାଆନ୍ତୁ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>କୁ କନଫିଗର କରାଯାଇଛି"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"କୀବୋର୍ଡ ଲେଆଉଟକୁ <xliff:g id="LAYOUT_1">%s</xliff:g>ରେ ସେଟ କରାଯାଇଛି। ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index e188a0dcbced..6ec3eda46ba2 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"ਵਾਈ-ਫਾਈ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"ਵਾਈ-ਫਾਈ ਕਾਲ"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ਬੰਦ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ਵਾਈ-ਫਾਈ \'ਤੇ ਕਾਲ ਕਰੋ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੋਂ ਕਾਲ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 031d576df1f0..274af139f5d2 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -2326,12 +2326,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> korzysta z obu wyświetlaczy, aby pokazać treści"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Urządzenie jest za ciepłe"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Podwójny ekran jest niedostępny, ponieważ telefon za bardzo się nagrzewa"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkcja Dual Screen jest niedostępna"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkcja Dual Screen jest niedostępna, ponieważ włączono Oszczędzanie baterii. Możesz to wyłączyć w Ustawieniach."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Otwórz ustawienia"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Wyłącz"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Skonfigurowano urządzenie <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Ustawiono układ klawiatury <xliff:g id="LAYOUT_1">%s</xliff:g>. Kliknij, aby to zmienić."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index a315bb1990b5..6d4419652873 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está usando as duas telas para mostrar conteúdo"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está muito quente"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A tela dupla está indisponível porque o smartphone está ficando muito quente"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"O recurso Dual Screen está indisponível"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"O recurso Dual Screen está indisponível porque a Economia de bateria está ativada. É possível desativar essa opção nas configurações."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir para Configurações"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desativar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Dispositivo <xliff:g id="DEVICE_NAME">%s</xliff:g> configurado"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%s</xliff:g>. Toque para mudar."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5a68166447a7..ff4fe09c36f8 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a usar ambos os ecrãs para mostrar conteúdo"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está a ficar demasiado quente"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A funcionalidade Dois ecrãs está indisponível porque o seu telemóvel está a ficar demasiado quente"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"A funcionalidade Dual Screen está indisponível"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"A funcionalidade Dual Screen está indisponível porque a Poupança de bateria está ativada. Pode desativar esta opção nas Definições."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Aceder às Definições"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desativar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Dispositivo <xliff:g id="DEVICE_NAME">%s</xliff:g> configurado"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Esquema do teclado definido como <xliff:g id="LAYOUT_1">%s</xliff:g>. Toque para o alterar."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index a315bb1990b5..6d4419652873 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2325,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está usando as duas telas para mostrar conteúdo"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está muito quente"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A tela dupla está indisponível porque o smartphone está ficando muito quente"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"O recurso Dual Screen está indisponível"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"O recurso Dual Screen está indisponível porque a Economia de bateria está ativada. É possível desativar essa opção nas configurações."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir para Configurações"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desativar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Dispositivo <xliff:g id="DEVICE_NAME">%s</xliff:g> configurado"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%s</xliff:g>. Toque para mudar."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 14570f7fa659..b425883d48d7 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Apelare prin Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Apelare prin Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Dezactivată"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Apelează prin Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Sună prin rețeaua mobilă"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> folosește ambele ecrane pentru a afișa conținut"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Dispozitivul este prea cald"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Funcția Dual Screen este indisponibilă, deoarece telefonul s-a încălzit prea tare"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funcția Dual Screen este indisponibilă"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funcția Dual Screen este indisponibilă, deoarece s-a activat Economisirea bateriei. Poți dezactiva această opțiune din Setări."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Accesează Setările"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Dezactivează"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"S-a configurat <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Aspectul tastaturii este setat la <xliff:g id="LAYOUT_1">%s</xliff:g>. Atinge pentru a-l schimba."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 3dffa92c7736..eccd18daac69 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Звонки по Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Звонок по Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Отключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Звонить по Wi‑Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Звонить по мобильной сети"</string> @@ -2327,12 +2326,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> показывает контент на обоих экранах."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Устройство перегрелось"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двойной экран недоступен из-за перегрева телефона."</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функция Dual Screen недоступна"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функция Dual Screen недоступна, так как включен режим энергосбережения. Вы можете отключить его в настройках."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Открыть настройки"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Отключить"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Устройство \"<xliff:g id="DEVICE_NAME">%s</xliff:g>\" настроено"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Для клавиатуры настроена раскладка <xliff:g id="LAYOUT_1">%s</xliff:g>. Нажмите, чтобы изменить."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 93302ffec9f0..01b04ec08354 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi ඇමතීම"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WiFi ඇමතුම"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ක්රියාවිරහිතයි"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ඔස්සේ ඇමතුම"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ජංගම ජාලය ඔස්සේ ඇමතුම"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 3ab9547f09ce..289489695bb5 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Volanie cez Wi‑Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Hovor cez Wi‑Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Vypnuté"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Volanie cez Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Volanie cez mobilnú sieť"</string> @@ -2327,12 +2326,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> zobrazuje obsah na oboch obrazovkách"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Zariadenie je príliš horúce"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojitá obrazovka nie je k dispozícii, pretože telefón sa prehrieva"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nie je k dispozícii"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nie je k dispozícii, pretože je zapnutý šetrič batérie. Môžete to vypnúť v Nastaveniach."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Prejsť do Nastavení"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Vypnúť"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Klávesnica <xliff:g id="DEVICE_NAME">%s</xliff:g> je nakonfigurovaná"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Rozloženie klávesnice je nastavené na jazyk <xliff:g id="LAYOUT_1">%s</xliff:g>. Môžete to zmeniť klepnutím."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index cdac3339b154..6d1d8b0f5560 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Klicanje prek Wi-Fi-ja"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"Govor prek Wi-Fi-ja"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Klic prek povezave Wifi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Izklopljeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Klic prek omrežja Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Klic prek mobilnega omrežja"</string> @@ -2327,12 +2326,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> uporablja oba zaslona za prikaz vsebine."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Naprava se pregreva"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojni zaslon ni na voljo, ker se telefon pregreva."</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ni na voljo"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ni na voljo, ker je vklopljeno varčevanje z energijo baterije. To lahko izklopite v nastavitvah."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Odpri nastavitve"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Izklopi"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Naprava <xliff:g id="DEVICE_NAME">%s</xliff:g> je konfigurirana"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Razporeditev tipkovnice je nastavljena na »<xliff:g id="LAYOUT_1">%s</xliff:g>«. Za spremembo se dotaknite."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 436a00df3a57..fc94221e7b76 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Telefonatë me WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Telefonatë me WiFi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Çaktivizuar"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Telefono nëpërmjet Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Telefono nëpërmjet rrjetit celular"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> po i përdor të dyja ekranet për të shfaqur përmbajtje"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Pajisja është shumë e nxehtë"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"\"Ekrani i dyfishtë\" nuk ofrohet sepse telefoni yt po nxehet shumë"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"\"Ekrani i dyfishtë\" nuk ofrohet"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"\"Ekrani i dyfishtë\" nuk ofrohet sepse \"Kursyesi i baterisë\" është aktiv. Mund ta çaktivizosh këtë te \"Cilësimet\"."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Shko te \"Cilësimet\""</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Çaktivizoje"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> u konfigurua"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Struktura e tastierës u caktua në: <xliff:g id="LAYOUT_1">%s</xliff:g>. Trokit për ta ndryshuar."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 6187a69262ab..deb4476bb246 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -141,8 +141,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Позивање преко WiFi-а"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Позив преко WiFi-ја"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Искључено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Позивање преко WiFi-а"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Позив преко мобилне мреже"</string> @@ -2326,12 +2325,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> користи оба екрана за приказивање садржаја"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Уређај је превише загрејан"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двојни екран је недоступан јер је телефон превише загрејан"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen није доступан"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen није доступан зато што је Уштеда батерије укључена. То можете да искључите у подешавањима."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Иди у Подешавања"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Искључи"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Уређај <xliff:g id="DEVICE_NAME">%s</xliff:g> је конфигурисан"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Распоред тастатуре је подешен на <xliff:g id="LAYOUT_1">%s</xliff:g>. Додирните да бисте то променили."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 5278939277f2..823c83640f2a 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wifi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"wifi-samtal"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wifi-samtal"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ring via wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Ring via mobilnätverk"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 139827137f71..e8861fde8d4f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Kupiga simu kupitia WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Simu ya WiFi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Imezimwa"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Piga simu ukitumia WI-FI"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Piga ukitumia mtandao wa simu"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> inatumia skrini zote kuonyesha maudhui"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Kifaa kina joto sana"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kipengele cha Hali ya Skrini Mbili hakipatikani kwa sababu simu yako inapata joto sana"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Kipengele cha Hali ya Skrini Mbili hakipatikani"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kipengele cha Hali ya Skrini Mbili hakipatikani kwa sababu kipengele cha Kiokoa Betri kimewashwa. Unaweza kuzima kipengele hiki katika Mipangilio."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Nenda kwenye Mipangilio"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Zima"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> imewekewa mipangilio"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Muundo wa kibodi umewekwa kuwa <xliff:g id="LAYOUT_1">%s</xliff:g>. Gusa ili ubadilishe."</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index a7eb123767ad..6c3591e95123 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"வைஃபை"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"வைஃபை அழைப்பு"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"வைஃபை அழைப்பு"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ஆஃப்"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"வைஃபை மூலம் அழை"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"மொபைல் நெட்வொர்க் மூலமாக அழை"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 530c2e6aa59d..dce037768574 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi కాలింగ్"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi కాల్"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ఆఫ్లో ఉంది"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi ద్వారా కాల్"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"మొబైల్ నెట్వర్క్ ద్వారా కాల్"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"కంటెంట్ను చూపడం కోసం <xliff:g id="APP_NAME">%1$s</xliff:g> రెండు డిస్ప్లేలనూ ఉపయోగిస్తుంది"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"పరికరం చాలా వేడిగా ఉంది"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"మీ ఫోన్ చాలా వేడిగా అవుతున్నందున, డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"బ్యాటరీ సేవర్ ఆన్లో ఉన్నందున డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు. మీరు దీన్ని సెట్టింగ్లలో ఆఫ్ చేయవచ్చు."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"సెట్టింగ్లకు వెళ్లండి"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ఆఫ్ చేయండి"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> కాన్ఫిగర్ చేయబడింది"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"కీబోర్డ్ లేఅవుట్ <xliff:g id="LAYOUT_1">%s</xliff:g>కు సెట్ చేయబడింది. మార్చడానికి ట్యాప్ చేయండి."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 0b481f3455df..eef7772803e5 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"การโทรผ่าน Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"การโทรผ่าน Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ปิด"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"โทรผ่าน Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"โทรผ่านเครือข่ายมือถือ"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังใช้จอแสดงผลทั้งสองจอเพื่อแสดงเนื้อหา"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"อุปกรณ์ร้อนเกินไป"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"หน้าจอคู่ไม่พร้อมให้ใช้งานเนื่องจากโทรศัพท์ของคุณร้อนเกินไป"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ใช้งานไม่ได้"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ใช้งานไม่ได้เนื่องจากเปิดโหมดประหยัดแบตเตอรี่อยู่ คุณปิดโหมดนี้ได้ในการตั้งค่า"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ไปที่การตั้งค่า"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ปิด"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"กำหนดค่า <xliff:g id="DEVICE_NAME">%s</xliff:g> แล้ว"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"ตั้งค่ารูปแบบแป้นพิมพ์เป็นภาษา<xliff:g id="LAYOUT_1">%s</xliff:g> แตะเพื่อเปลี่ยน"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index e7005db25cd9..d2137f64ccb3 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Pagtawag Gamit ang WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Tawag sa pamamagitan ng Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Naka-off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Tumawag gamit ang Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Tumawag gamit ang mobile network"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Ginagamit ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang parehong display para magpakita ng content"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Masyadong mainit ang device"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Hindi available ang Dual Screen dahil masyado nang umiinit ang telepono mo"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Hindi available ang Dual Screen"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Hindi available ang Dual Screen dahil naka-on ang Pantipid ng Baterya. Puwede mo itong i-off sa Mga Setting."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Pumunta sa Mga Setting"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"I-off"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Na-configure ang <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Naitakda ang layout ng keyboard sa <xliff:g id="LAYOUT_1">%s</xliff:g>. I-tap para baguhin."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 998b2fa22b65..b2d7617e9867 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Kablosuz"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Kablosuz Çağrı"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Kablosuz Çağrı"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Kapalı"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Kablosuz ağ üzerinden arama"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil ağ üzerinden arama"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index be4b2a2e5ae8..9296f6a9e669 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -142,8 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Дзвінки через Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"Передавання голосу через Wi-Fi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Дзвінки через Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Вимкнено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Телефонувати через Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Телефонувати через мобільну мережу"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 977374e1d052..49700501a267 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> مواد دکھانے کیلئے دونوں ڈسپلیز استعمال کر رہی ہے"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"آلہ بہت زیادہ گرم ہے"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"دوہری اسکرین دستیاب نہیں ہے کیونکہ آپ کا فون بہت زیادہ گرم ہو رہا ہے"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen دستیاب نہیں ہے"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen دستیاب نہیں ہے کیونکہ بیٹری سیور آن ہے۔ آپ اسے ترتیبات میں آف کر سکتے ہیں۔"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"ترتیبات پر جائیں"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"آف کریں"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> میں کنفیگر کیا گیا"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"کی بورڈ لے آؤٹ <xliff:g id="LAYOUT_1">%s</xliff:g> پر سیٹ ہے۔ تبدیل کرنے کیلئے تھپتھپائیں۔"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 08b44716e4d7..69b2efb25f2f 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -2324,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> kontentni ikkala ekranda chiqarmoqda"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Qurilma qizib ketdi"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Telefon qizib ketgani uchun hozir ikki ekranli rejim ishlamaydi"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Ikki ekranli rejim ishlamaydi"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Quvvatni tejash yoniqligi uchun hozir ikki ekranli rejim ishlamaydi. Buni Sozlamalarda faolsizlantirishingiz mumkin."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Sozlamalarni ochish"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Faolsizlantirish"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> sozlandi"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klaviatura terilmasi bunga sozlandi: <xliff:g id="LAYOUT_1">%s</xliff:g>. Oʻzgartirish uchun ustiga bosing."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 29acdc08b913..93907f9c0582 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Gọi qua Wi-Fi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Cuộc gọi qua Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Tắt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Gọi qua Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Gọi qua mạng di động"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang dùng cả hai màn hình để thể hiện nội dung"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Thiết bị quá nóng"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Không bật được chế độ Màn hình đôi vì điện thoại của bạn quá nóng"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Không bật được chế độ Dual Screen"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Không bật được chế độ Dual Screen vì Trình tiết kiệm pin đang bật. Bạn có thể tắt Trình tiết kiệm pin trong phần Cài đặt."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Chuyển đến phần Cài đặt"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Tắt"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Đã định cấu hình <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Đã thiết lập bố cục bàn phím thành <xliff:g id="LAYOUT_1">%s</xliff:g>. Hãy nhấn để thay đổi."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 428531e3af52..818f1ff39c06 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WLAN"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WLAN 通话"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"WLAN 通话"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"已关闭"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"通过 WLAN 进行通话"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"通过移动网络进行通话"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>正在使用双屏幕显示内容"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"设备过热"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"手机过热,因此无法使用双屏幕功能"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"“双屏幕”功能不可用"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"省电模式已开启,因此“双屏幕”功能不可用。您可在“设置”中关闭此模式。"</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"前往“设置”"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"关闭"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"已配置“<xliff:g id="DEVICE_NAME">%s</xliff:g>”"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"键盘布局已设为<xliff:g id="LAYOUT_1">%s</xliff:g>。点按即可更改。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 0caf9578844e..67db0604052d 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi 通話"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi 通話"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"使用 Wi-Fi 通話"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"使用流動網絡通話"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 90d7e21f9e81..b3af8e327b0e 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi 通話"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi 通話"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"透過 Wi-Fi 進行通話"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"透過行動網路進行通話"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 967d9eafbf4f..0f9bde71fabd 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -140,8 +140,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"I-Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Ukushaya kwe-WiFi"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) --> - <skip /> + <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Ikholi ye-Wi-Fi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Valiwe"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Ikholi esebenza nge-Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Shaya ngenethiwekhi yeselula"</string> @@ -2325,12 +2324,9 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> isebenzisa zombili izibonisi ukukhombisa okuqukethwe"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Idivayisi ifudumele kakhulu"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"I-Dual Screen ayitholakali ngoba ifoni yakho iqala ukufudumala kakhulu"</string> - <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) --> - <skip /> - <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) --> - <skip /> - <!-- no translation found for device_state_notification_settings_button (691937505741872749) --> - <skip /> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Isikrini Esikabili asitholakali"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Isikrini Esikabili asitholakali ngoba Isilondolozi Sebhethri sivuliwe. Ungavala lokhu Kumasethingi."</string> + <string name="device_state_notification_settings_button" msgid="691937505741872749">"Iya Kumasethingi"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Vala"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"I-<xliff:g id="DEVICE_NAME">%s</xliff:g> ilungiselelwe"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Isakhiwo sekhibhodi sisethelwe ku-<xliff:g id="LAYOUT_1">%s</xliff:g>. Thepha ukushintsha."</string> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 31e5f3265823..e67ea82cb6da 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -470,18 +470,18 @@ <color name="system_on_error_light">#FFFFFF</color> <color name="system_error_container_light">#FFDAD5</color> <color name="system_on_error_container_light">#410000</color> - <color name="system_primary_fixed_light">#D8E2FF</color> - <color name="system_primary_fixed_dim_light">#ADC6FF</color> - <color name="system_on_primary_fixed_light">#001A41</color> - <color name="system_on_primary_fixed_variant_light">#2B4678</color> - <color name="system_secondary_fixed_light">#DBE2F9</color> - <color name="system_secondary_fixed_dim_light">#BFC6DC</color> - <color name="system_on_secondary_fixed_light">#141B2C</color> - <color name="system_on_secondary_fixed_variant_light">#3F4759</color> - <color name="system_tertiary_fixed_light">#FBD7FC</color> - <color name="system_tertiary_fixed_dim_light">#DEBCDF</color> - <color name="system_on_tertiary_fixed_light">#29132D</color> - <color name="system_on_tertiary_fixed_variant_light">#583E5B</color> + <color name="system_primary_fixed">#D8E2FF</color> + <color name="system_primary_fixed_dim">#ADC6FF</color> + <color name="system_on_primary_fixed">#001A41</color> + <color name="system_on_primary_fixed_variant">#2B4678</color> + <color name="system_secondary_fixed">#DBE2F9</color> + <color name="system_secondary_fixed_dim">#BFC6DC</color> + <color name="system_on_secondary_fixed">#141B2C</color> + <color name="system_on_secondary_fixed_variant">#3F4759</color> + <color name="system_tertiary_fixed">#FBD7FC</color> + <color name="system_tertiary_fixed_dim">#DEBCDF</color> + <color name="system_on_tertiary_fixed">#29132D</color> + <color name="system_on_tertiary_fixed_variant">#583E5B</color> <color name="system_control_activated_light">#D8E2FF</color> <color name="system_control_normal_light">#44474F</color> <color name="system_control_highlight_light">#1F000000</color> @@ -526,18 +526,6 @@ <color name="system_on_error_dark">#690001</color> <color name="system_error_container_dark">#930001</color> <color name="system_on_error_container_dark">#FFDAD5</color> - <color name="system_primary_fixed_dark">#D8E2FF</color> - <color name="system_primary_fixed_dim_dark">#ADC6FF</color> - <color name="system_on_primary_fixed_dark">#001A41</color> - <color name="system_on_primary_fixed_variant_dark">#2B4678</color> - <color name="system_secondary_fixed_dark">#DBE2F9</color> - <color name="system_secondary_fixed_dim_dark">#BFC6DC</color> - <color name="system_on_secondary_fixed_dark">#141B2C</color> - <color name="system_on_secondary_fixed_variant_dark">#3F4759</color> - <color name="system_tertiary_fixed_dark">#FBD7FC</color> - <color name="system_tertiary_fixed_dim_dark">#DEBCDF</color> - <color name="system_on_tertiary_fixed_dark">#29132D</color> - <color name="system_on_tertiary_fixed_variant_dark">#583E5B</color> <color name="system_control_activated_dark">#2B4678</color> <color name="system_control_normal_dark">#C4C6D0</color> <color name="system_control_highlight_dark">#33FFFFFF</color> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0600b3802fe1..5a35ca74e5dc 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2895,6 +2895,9 @@ mirror the content of the default display. --> <bool name="config_localDisplaysMirrorContent">true</bool> + <!-- When true, udfps vote is ignored. This feature is disabled by default. --> + <bool name="config_ignoreUdfpsVote">false</bool> + <!-- Controls if local secondary displays should be private or not. Value specified in the array represents physical port address of each display and display in this list will be marked as private. {@see android.view.Display#FLAG_PRIVATE} --> @@ -5582,10 +5585,20 @@ split screen. --> <bool name="config_isWindowManagerCameraCompatTreatmentEnabled">false</bool> + <!-- Whether should use split screen aspect ratio for the activity when camera compat treatment + is enabled and activity is connected to the camera in fullscreen. --> + <bool name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled">false</bool> + <!-- Whether a camera compat controller is enabled to allow the user to apply or revert treatment for stretched issues in camera viewfinder. --> <bool name="config_isCameraCompatControlForStretchedIssuesEnabled">false</bool> + <!-- Docking is a uiMode configuration change and will cause activities to relaunch if it's not + handled. If true, the configuration change will be sent but activities will not be + relaunched upon docking. Apps with desk resources will behave like normal, since they may + expect the relaunch upon the desk uiMode change. --> + <bool name="config_skipActivityRelaunchWhenDocking">false</bool> + <!-- If true, hide the display cutout with display area --> <bool name="config_hideDisplayCutoutWithDisplayArea">false</bool> diff --git a/core/res/res/values/config_telephony.xml b/core/res/res/values/config_telephony.xml index c0f2157646eb..fab760948787 100644 --- a/core/res/res/values/config_telephony.xml +++ b/core/res/res/values/config_telephony.xml @@ -62,6 +62,11 @@ <integer name="auto_data_switch_validation_max_retry">7</integer> <java-symbol type="integer" name="auto_data_switch_validation_max_retry" /> + <!-- Boolean indicating whether ping test is required to pass on the target data SIM before the + device automatically switch to it. --> + <bool name="auto_data_switch_ping_test_before_switch">true</bool> + <java-symbol type="bool" name="auto_data_switch_ping_test_before_switch" /> + <!-- Boolean indicating whether the Iwlan data service supports persistence of iwlan ipsec tunnels across service restart. If iwlan tunnels are not persisted across restart, Framework will clean up dangling data connections when service restarts --> diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index 12a6c5262f05..9cbf3b679851 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -191,18 +191,18 @@ <public name="system_on_error_light" /> <public name="system_error_container_light" /> <public name="system_on_error_container_light" /> - <public name="system_primary_fixed_light" /> - <public name="system_primary_fixed_dim_light" /> - <public name="system_on_primary_fixed_light" /> - <public name="system_on_primary_fixed_variant_light" /> - <public name="system_secondary_fixed_light" /> - <public name="system_secondary_fixed_dim_light" /> - <public name="system_on_secondary_fixed_light" /> - <public name="system_on_secondary_fixed_variant_light" /> - <public name="system_tertiary_fixed_light" /> - <public name="system_tertiary_fixed_dim_light" /> - <public name="system_on_tertiary_fixed_light" /> - <public name="system_on_tertiary_fixed_variant_light" /> + <public name="removed_system_primary_fixed_light" /> + <public name="removed_system_primary_fixed_dim_light" /> + <public name="removed_system_on_primary_fixed_light" /> + <public name="removed_system_on_primary_fixed_variant_light" /> + <public name="removed_system_secondary_fixed_light" /> + <public name="removed_system_secondary_fixed_dim_light" /> + <public name="removed_system_on_secondary_fixed_light" /> + <public name="removed_system_on_secondary_fixed_variant_light" /> + <public name="removed_system_tertiary_fixed_light" /> + <public name="removed_system_tertiary_fixed_dim_light" /> + <public name="removed_system_on_tertiary_fixed_light" /> + <public name="removed_system_on_tertiary_fixed_variant_light" /> <public name="system_control_activated_light" /> <public name="system_control_normal_light" /> <public name="system_control_highlight_light" /> @@ -246,18 +246,18 @@ <public name="system_on_error_dark"/> <public name="system_error_container_dark"/> <public name="system_on_error_container_dark"/> - <public name="system_primary_fixed_dark"/> - <public name="system_primary_fixed_dim_dark"/> - <public name="system_on_primary_fixed_dark"/> - <public name="system_on_primary_fixed_variant_dark"/> - <public name="system_secondary_fixed_dark"/> - <public name="system_secondary_fixed_dim_dark"/> - <public name="system_on_secondary_fixed_dark"/> - <public name="system_on_secondary_fixed_variant_dark"/> - <public name="system_tertiary_fixed_dark"/> - <public name="system_tertiary_fixed_dim_dark"/> - <public name="system_on_tertiary_fixed_dark"/> - <public name="system_on_tertiary_fixed_variant_dark"/> + <public name="removed_system_primary_fixed_dark"/> + <public name="removed_system_primary_fixed_dim_dark"/> + <public name="removed_system_on_primary_fixed_dark"/> + <public name="removed_system_on_primary_fixed_variant_dark"/> + <public name="removed_system_secondary_fixed_dark"/> + <public name="removed_system_secondary_fixed_dim_dark"/> + <public name="removed_system_on_secondary_fixed_dark"/> + <public name="removed_system_on_secondary_fixed_variant_dark"/> + <public name="removed_system_tertiary_fixed_dark"/> + <public name="removed_system_tertiary_fixed_dim_dark"/> + <public name="removed_system_on_tertiary_fixed_dark"/> + <public name="removed_system_on_tertiary_fixed_variant_dark"/> <public name="system_control_activated_dark"/> <public name="system_control_normal_dark"/> <public name="system_control_highlight_dark"/> @@ -271,6 +271,18 @@ <public name="system_palette_key_color_tertiary_dark"/> <public name="system_palette_key_color_neutral_dark"/> <public name="system_palette_key_color_neutral_variant_dark"/> + <public name="system_primary_fixed" /> + <public name="system_primary_fixed_dim" /> + <public name="system_on_primary_fixed" /> + <public name="system_on_primary_fixed_variant" /> + <public name="system_secondary_fixed" /> + <public name="system_secondary_fixed_dim" /> + <public name="system_on_secondary_fixed" /> + <public name="system_on_secondary_fixed_variant" /> + <public name="system_tertiary_fixed" /> + <public name="system_tertiary_fixed_dim" /> + <public name="system_on_tertiary_fixed" /> + <public name="system_on_tertiary_fixed_variant" /> <public name="system_outline_variant_light" /> <public name="system_outline_variant_dark" /> </staging-public-group> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 25be28cb65ed..8fb7c9d16170 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -414,6 +414,7 @@ <java-symbol type="bool" name="config_guestUserAutoCreated" /> <java-symbol type="bool" name="config_guestUserAllowEphemeralStateChange" /> <java-symbol type="bool" name="config_localDisplaysMirrorContent" /> + <java-symbol type="bool" name="config_ignoreUdfpsVote" /> <java-symbol type="array" name="config_localPrivateDisplayPorts" /> <java-symbol type="integer" name="config_defaultDisplayDefaultColorMode" /> <java-symbol type="bool" name="config_enableAppWidgetService" /> @@ -4500,7 +4501,9 @@ <java-symbol type="bool" name="config_letterboxIsDisplayAspectRatioForFixedOrientationLetterboxEnabled" /> <java-symbol type="bool" name="config_isCompatFakeFocusEnabled" /> <java-symbol type="bool" name="config_isWindowManagerCameraCompatTreatmentEnabled" /> + <java-symbol type="bool" name="config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled" /> <java-symbol type="bool" name="config_isCameraCompatControlForStretchedIssuesEnabled" /> + <java-symbol type="bool" name="config_skipActivityRelaunchWhenDocking" /> <java-symbol type="bool" name="config_hideDisplayCutoutWithDisplayArea" /> @@ -4991,8 +4994,7 @@ <java-symbol type="bool" name="config_batteryStatsResetOnUnplugHighBatteryLevel" /> <java-symbol type="bool" name="config_batteryStatsResetOnUnplugAfterSignificantCharge" /> - - + <java-symbol name="materialColorOnSecondaryFixedVariant" type="attr"/> <java-symbol name="materialColorOnTertiaryFixedVariant" type="attr"/> <java-symbol name="materialColorSurfaceContainerLowest" type="attr"/> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 2986bdf59a51..2e3d145130a8 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -239,33 +239,33 @@ easier. <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -282,7 +282,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -335,33 +334,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -378,7 +377,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -430,33 +428,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -473,7 +471,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -527,33 +524,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -570,7 +567,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -623,33 +619,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -666,7 +662,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -727,33 +722,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -770,7 +765,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -822,33 +816,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -865,7 +859,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -916,33 +909,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -959,7 +952,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1011,33 +1003,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1054,7 +1046,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1122,33 +1113,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1165,7 +1156,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1218,33 +1208,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1261,7 +1251,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1312,33 +1301,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1355,7 +1344,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1408,33 +1396,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1451,7 +1439,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1503,33 +1490,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1546,7 +1533,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1598,33 +1584,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1641,7 +1627,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1693,33 +1678,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1736,7 +1721,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1788,33 +1772,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1831,7 +1815,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1883,33 +1866,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -1926,7 +1909,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -1983,33 +1965,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -2026,7 +2008,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -2076,33 +2057,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -2119,7 +2100,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -2307,33 +2287,33 @@ easier. <item name="colorPopupBackground">?attr/colorBackgroundFloating</item> <item name="panelColorBackground">?attr/colorBackgroundFloating</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2402,33 +2382,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2496,33 +2476,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2591,33 +2571,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2688,33 +2668,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2784,33 +2764,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2886,33 +2866,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -2984,33 +2964,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3081,33 +3061,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3179,33 +3159,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3258,33 +3238,33 @@ easier. <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3337,33 +3317,33 @@ easier. <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3435,33 +3415,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3534,33 +3514,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3631,33 +3611,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3727,33 +3707,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3822,33 +3802,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -3917,33 +3897,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -4010,33 +3990,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -4110,33 +4090,33 @@ easier. <item name="colorListDivider">@color/list_divider_color_light</item> <item name="opacityListDivider">@color/list_divider_opacity_device_default_light</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4153,7 +4133,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4191,33 +4170,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4234,7 +4213,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4264,33 +4242,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4307,7 +4285,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4359,33 +4336,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4402,7 +4379,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4438,33 +4414,33 @@ easier. <!-- Dialog attributes --> <item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4481,7 +4457,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4557,33 +4532,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4600,7 +4575,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4654,33 +4628,33 @@ easier. <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4697,7 +4671,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4777,33 +4750,33 @@ easier. <item name="colorAccentSecondary">@color/accent_secondary_device_default</item> <item name="colorAccentTertiary">@color/accent_tertiary_device_default</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4820,7 +4793,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4830,33 +4802,33 @@ easier. <item name="colorAccentSecondary">@color/accent_secondary_device_default</item> <item name="colorAccentTertiary">@color/accent_tertiary_device_default</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -4887,33 +4859,33 @@ easier. <item name="colorAccentSecondary">@color/accent_secondary_device_default</item> <item name="colorAccentTertiary">@color/accent_tertiary_device_default</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -4930,7 +4902,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> @@ -4940,33 +4911,33 @@ easier. <item name="layout_gravity">center</item> <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_light</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_light</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_light</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_light</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_light</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_light</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_light</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_light</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item> <item name="materialColorErrorContainer">@color/system_error_container_light</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_light</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_light</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_light</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_light</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_light</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item> <item name="materialColorOnBackground">@color/system_on_background_light</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_light</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_light</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item> @@ -5004,33 +4975,33 @@ easier. <item name="textColorPrimary">@color/system_neutral1_900</item> <item name="textColorSecondary">@color/system_neutral2_700</item> - <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant_dark</item> - <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant_dark</item> + <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item> + <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item> <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item> - <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant_dark</item> + <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item> <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item> <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item> <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item> <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item> - <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim_dark</item> + <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item> <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item> - <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed_dark</item> + <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item> <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item> - <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim_dark</item> - <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed_dark</item> - <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim_dark</item> + <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item> + <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item> + <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item> <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item> <item name="materialColorErrorContainer">@color/system_error_container_dark</item> - <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed_dark</item> + <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item> <item name="materialColorPrimaryInverse">@color/system_primary_dark</item> - <item name="materialColorSecondaryFixed">@color/system_secondary_fixed_dark</item> + <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item> <item name="materialColorSurfaceInverse">@color/system_surface_dark</item> <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item> <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item> - <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed_dark</item> + <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item> <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item> <item name="materialColorOnBackground">@color/system_on_background_dark</item> - <item name="materialColorPrimaryFixed">@color/system_primary_fixed_dark</item> + <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item> <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item> <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item> <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item> @@ -5047,7 +5018,6 @@ easier. <item name="materialColorOnPrimary">@color/system_on_primary_dark</item> <item name="materialColorOnSurface">@color/system_on_surface_dark</item> <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> - <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item> </style> <style name="Theme.DeviceDefault.AutofillHalfScreenDialogList" parent="Theme.DeviceDefault.DayNight"> diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index 6debbfeae084..c5b00c9bfb22 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -16,7 +16,6 @@ package android.app; -import static android.app.Notification.Builder.ensureColorSpanContrast; import static android.app.Notification.CarExtender.UnreadConversation.KEY_ON_READ; import static android.app.Notification.CarExtender.UnreadConversation.KEY_ON_REPLY; import static android.app.Notification.CarExtender.UnreadConversation.KEY_REMOTE_INPUT; @@ -66,7 +65,6 @@ import android.annotation.Nullable; import android.content.Context; import android.content.Intent; import android.content.LocusId; -import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -436,93 +434,7 @@ public class NotificationTest { assertThat(Notification.Builder.getFullLengthSpanColor(text)).isEqualTo(expectedTextColor); } - @Test - public void testBuilder_ensureColorSpanContrast_removesAllFullLengthColorSpans() { - Spannable text = new SpannableString("blue text with yellow and green"); - text.setSpan(new ForegroundColorSpan(Color.YELLOW), 15, 21, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - text.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), - Spanned.SPAN_INCLUSIVE_INCLUSIVE); - TextAppearanceSpan taSpan = new TextAppearanceSpan(mContext, - R.style.TextAppearance_DeviceDefault_Notification_Title); - assertThat(taSpan.getTextColor()).isNotNull(); // it must be set to prove it is cleared. - text.setSpan(taSpan, 0, text.length(), - Spanned.SPAN_INCLUSIVE_INCLUSIVE); - text.setSpan(new ForegroundColorSpan(Color.GREEN), 26, 31, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - Spannable result = (Spannable) ensureColorSpanContrast(text, Color.BLACK); - Object[] spans = result.getSpans(0, result.length(), Object.class); - assertThat(spans).hasLength(3); - - assertThat(result.getSpanStart(spans[0])).isEqualTo(15); - assertThat(result.getSpanEnd(spans[0])).isEqualTo(21); - assertThat(((ForegroundColorSpan) spans[0]).getForegroundColor()).isEqualTo(Color.YELLOW); - - assertThat(result.getSpanStart(spans[1])).isEqualTo(0); - assertThat(result.getSpanEnd(spans[1])).isEqualTo(31); - assertThat(spans[1]).isNotSameInstanceAs(taSpan); // don't mutate the existing span - assertThat(((TextAppearanceSpan) spans[1]).getFamily()).isEqualTo(taSpan.getFamily()); - assertThat(((TextAppearanceSpan) spans[1]).getTextColor()).isNull(); - - assertThat(result.getSpanStart(spans[2])).isEqualTo(26); - assertThat(result.getSpanEnd(spans[2])).isEqualTo(31); - assertThat(((ForegroundColorSpan) spans[2]).getForegroundColor()).isEqualTo(Color.GREEN); - } - - @Test - public void testBuilder_ensureColorSpanContrast_partialLength_adjusted() { - int background = 0xFFFF0101; // Slightly lighter red - CharSequence text = new SpannableStringBuilder() - .append("text with ") - .append("some red", new ForegroundColorSpan(Color.RED), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - CharSequence result = ensureColorSpanContrast(text, background); - // ensure the span has been updated to have > 1.3:1 contrast ratio with fill color - Object[] spans = ((Spannable) result).getSpans(0, result.length(), Object.class); - assertThat(spans).hasLength(1); - int foregroundColor = ((ForegroundColorSpan) spans[0]).getForegroundColor(); - assertContrastIsWithinRange(foregroundColor, background, 3, 3.2); - } - - @Test - public void testBuilder_ensureColorSpanContrast_worksWithComplexInput() { - Spannable text = new SpannableString("blue text with yellow and green and cyan"); - text.setSpan(new ForegroundColorSpan(Color.YELLOW), 15, 21, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - text.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), - Spanned.SPAN_INCLUSIVE_INCLUSIVE); - // cyan TextAppearanceSpan - TextAppearanceSpan taSpan = new TextAppearanceSpan(mContext, - R.style.TextAppearance_DeviceDefault_Notification_Title); - taSpan = new TextAppearanceSpan(taSpan.getFamily(), taSpan.getTextStyle(), - taSpan.getTextSize(), ColorStateList.valueOf(Color.CYAN), null); - text.setSpan(taSpan, 36, 40, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - text.setSpan(new ForegroundColorSpan(Color.GREEN), 26, 31, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - Spannable result = (Spannable) ensureColorSpanContrast(text, Color.GRAY); - Object[] spans = result.getSpans(0, result.length(), Object.class); - assertThat(spans).hasLength(3); - - assertThat(result.getSpanStart(spans[0])).isEqualTo(15); - assertThat(result.getSpanEnd(spans[0])).isEqualTo(21); - assertThat(((ForegroundColorSpan) spans[0]).getForegroundColor()).isEqualTo(Color.YELLOW); - - assertThat(result.getSpanStart(spans[1])).isEqualTo(36); - assertThat(result.getSpanEnd(spans[1])).isEqualTo(40); - assertThat(spans[1]).isNotSameInstanceAs(taSpan); // don't mutate the existing span - assertThat(((TextAppearanceSpan) spans[1]).getFamily()).isEqualTo(taSpan.getFamily()); - ColorStateList newCyanList = ((TextAppearanceSpan) spans[1]).getTextColor(); - assertThat(newCyanList).isNotNull(); - assertContrastIsWithinRange(newCyanList.getDefaultColor(), Color.GRAY, 3, 3.2); - - assertThat(result.getSpanStart(spans[2])).isEqualTo(26); - assertThat(result.getSpanEnd(spans[2])).isEqualTo(31); - int newGreen = ((ForegroundColorSpan) spans[2]).getForegroundColor(); - assertThat(newGreen).isNotEqualTo(Color.GREEN); - assertContrastIsWithinRange(newGreen, Color.GRAY, 3, 3.2); - } @Test public void testBuilder_ensureButtonFillContrast_adjustsDarker() { diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java index 3d4918b1bd42..6d635af20645 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java @@ -58,7 +58,7 @@ public class AccessibilityNodeInfoTest { // The number of flags held in boolean properties. Their values should also be double-checked // in the methods above. - private static final int NUM_BOOLEAN_PROPERTIES = 27; + private static final int NUM_BOOLEAN_PROPERTIES = 26; @Test public void testStandardActions_serializationFlagIsValid() { diff --git a/core/tests/coretests/src/com/android/internal/util/ContrastColorUtilTest.java b/core/tests/coretests/src/com/android/internal/util/ContrastColorUtilTest.java index cfe660c77817..5f5bf1165004 100644 --- a/core/tests/coretests/src/com/android/internal/util/ContrastColorUtilTest.java +++ b/core/tests/coretests/src/com/android/internal/util/ContrastColorUtilTest.java @@ -20,14 +20,35 @@ import static androidx.core.graphics.ColorUtils.calculateContrast; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; +import android.content.res.ColorStateList; import android.graphics.Color; - +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.text.style.TextAppearanceSpan; + +import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; +import com.android.internal.R; + import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; + public class ContrastColorUtilTest extends TestCase { + private Context mContext; + + @Before + public void setUp() { + mContext = InstrumentationRegistry.getContext(); + } + @SmallTest public void testEnsureTextContrastAgainstDark() { int darkBg = 0xFF35302A; @@ -70,6 +91,91 @@ public class ContrastColorUtilTest extends TestCase { assertContrastIsWithinRange(selfContrastColor, lightBg, 4.5, 4.75); } + public void testBuilder_ensureColorSpanContrast_removesAllFullLengthColorSpans() { + Spannable text = new SpannableString("blue text with yellow and green"); + text.setSpan(new ForegroundColorSpan(Color.YELLOW), 15, 21, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + text.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), + Spanned.SPAN_INCLUSIVE_INCLUSIVE); + TextAppearanceSpan taSpan = new TextAppearanceSpan(mContext, + R.style.TextAppearance_DeviceDefault_Notification_Title); + assertThat(taSpan.getTextColor()).isNotNull(); // it must be set to prove it is cleared. + text.setSpan(taSpan, 0, text.length(), + Spanned.SPAN_INCLUSIVE_INCLUSIVE); + text.setSpan(new ForegroundColorSpan(Color.GREEN), 26, 31, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + Spannable result = (Spannable) ContrastColorUtil.ensureColorSpanContrast(text, Color.BLACK); + Object[] spans = result.getSpans(0, result.length(), Object.class); + assertThat(spans).hasLength(3); + + assertThat(result.getSpanStart(spans[0])).isEqualTo(15); + assertThat(result.getSpanEnd(spans[0])).isEqualTo(21); + assertThat(((ForegroundColorSpan) spans[0]).getForegroundColor()).isEqualTo(Color.YELLOW); + + assertThat(result.getSpanStart(spans[1])).isEqualTo(0); + assertThat(result.getSpanEnd(spans[1])).isEqualTo(31); + assertThat(spans[1]).isNotSameInstanceAs(taSpan); // don't mutate the existing span + assertThat(((TextAppearanceSpan) spans[1]).getFamily()).isEqualTo(taSpan.getFamily()); + assertThat(((TextAppearanceSpan) spans[1]).getTextColor()).isNull(); + + assertThat(result.getSpanStart(spans[2])).isEqualTo(26); + assertThat(result.getSpanEnd(spans[2])).isEqualTo(31); + assertThat(((ForegroundColorSpan) spans[2]).getForegroundColor()).isEqualTo(Color.GREEN); + } + + public void testBuilder_ensureColorSpanContrast_partialLength_adjusted() { + int background = 0xFFFF0101; // Slightly lighter red + CharSequence text = new SpannableStringBuilder() + .append("text with ") + .append("some red", new ForegroundColorSpan(Color.RED), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + CharSequence result = ContrastColorUtil.ensureColorSpanContrast(text, background); + + // ensure the span has been updated to have > 1.3:1 contrast ratio with fill color + Object[] spans = ((Spannable) result).getSpans(0, result.length(), Object.class); + assertThat(spans).hasLength(1); + int foregroundColor = ((ForegroundColorSpan) spans[0]).getForegroundColor(); + assertContrastIsWithinRange(foregroundColor, background, 3, 3.2); + } + + public void testBuilder_ensureColorSpanContrast_worksWithComplexInput() { + Spannable text = new SpannableString("blue text with yellow and green and cyan"); + text.setSpan(new ForegroundColorSpan(Color.YELLOW), 15, 21, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + text.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), + Spanned.SPAN_INCLUSIVE_INCLUSIVE); + // cyan TextAppearanceSpan + TextAppearanceSpan taSpan = new TextAppearanceSpan(mContext, + R.style.TextAppearance_DeviceDefault_Notification_Title); + taSpan = new TextAppearanceSpan(taSpan.getFamily(), taSpan.getTextStyle(), + taSpan.getTextSize(), ColorStateList.valueOf(Color.CYAN), null); + text.setSpan(taSpan, 36, 40, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + text.setSpan(new ForegroundColorSpan(Color.GREEN), 26, 31, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + Spannable result = (Spannable) ContrastColorUtil.ensureColorSpanContrast(text, Color.GRAY); + Object[] spans = result.getSpans(0, result.length(), Object.class); + assertThat(spans).hasLength(3); + + assertThat(result.getSpanStart(spans[0])).isEqualTo(15); + assertThat(result.getSpanEnd(spans[0])).isEqualTo(21); + assertThat(((ForegroundColorSpan) spans[0]).getForegroundColor()).isEqualTo(Color.YELLOW); + + assertThat(result.getSpanStart(spans[1])).isEqualTo(36); + assertThat(result.getSpanEnd(spans[1])).isEqualTo(40); + assertThat(spans[1]).isNotSameInstanceAs(taSpan); // don't mutate the existing span + assertThat(((TextAppearanceSpan) spans[1]).getFamily()).isEqualTo(taSpan.getFamily()); + ColorStateList newCyanList = ((TextAppearanceSpan) spans[1]).getTextColor(); + assertThat(newCyanList).isNotNull(); + assertContrastIsWithinRange(newCyanList.getDefaultColor(), Color.GRAY, 3, 3.2); + + assertThat(result.getSpanStart(spans[2])).isEqualTo(26); + assertThat(result.getSpanEnd(spans[2])).isEqualTo(31); + int newGreen = ((ForegroundColorSpan) spans[2]).getForegroundColor(); + assertThat(newGreen).isNotEqualTo(Color.GREEN); + assertContrastIsWithinRange(newGreen, Color.GRAY, 3, 3.2); + } + public static void assertContrastIsWithinRange(int foreground, int background, double minContrast, double maxContrast) { assertContrastIsAtLeast(foreground, background, minContrast); diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 6328b02cf56a..2c85fe4e9206 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -160,6 +160,7 @@ <assign-permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" uid="media" /> <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="media" /> <assign-permission name="android.permission.INTERACT_ACROSS_USERS" uid="media" /> + <assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="media" /> <assign-permission name="android.permission.INTERNET" uid="media" /> @@ -173,6 +174,7 @@ <assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="audioserver" /> <assign-permission name="android.permission.INTERACT_ACROSS_USERS_FULL" uid="audioserver" /> <assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="audioserver" /> + <assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="audioserver" /> <assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="cameraserver" /> <assign-permission name="android.permission.INTERACT_ACROSS_USERS_FULL" uid="cameraserver" /> @@ -186,6 +188,7 @@ <assign-permission name="android.permission.MANAGE_APP_OPS_MODES" uid="cameraserver" /> <assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="cameraserver" /> <assign-permission name="android.permission.REAL_GET_TASKS" uid="cameraserver" /> + <assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="cameraserver" /> <assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" /> diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java index dcc12ac07589..b917ac80256c 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java @@ -215,6 +215,8 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub { } else { closingTargets.add(target); closingWholeScreenBounds.union(target.screenSpaceBounds); + // Union the start bounds since this may be the ClosingChanging animation. + closingWholeScreenBounds.union(target.startBounds); } } diff --git a/libs/WindowManager/Shell/res/color-night/taskbar_background.xml b/libs/WindowManager/Shell/res/color-night/taskbar_background.xml index 9473cdd607d6..01df006f1bd2 100644 --- a/libs/WindowManager/Shell/res/color-night/taskbar_background.xml +++ b/libs/WindowManager/Shell/res/color-night/taskbar_background.xml @@ -16,5 +16,5 @@ --> <!-- Should be the same as in packages/apps/Launcher3/res/color-night-v31/taskbar_background.xml --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="@android:color/system_neutral1_500" android:lStar="15" /> + <item android:color="@android:color/system_neutral1_500" android:lStar="20" /> </selector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/color/taskbar_background.xml b/libs/WindowManager/Shell/res/color/taskbar_background.xml index 0e165fca4fd3..876ee02a8adf 100644 --- a/libs/WindowManager/Shell/res/color/taskbar_background.xml +++ b/libs/WindowManager/Shell/res/color/taskbar_background.xml @@ -16,5 +16,5 @@ --> <!-- Should be the same as in packages/apps/Launcher3/res/color-v31/taskbar_background.xml --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="@android:color/system_neutral1_500" android:lStar="95" /> + <item android:color="@android:color/system_neutral1_500" android:lStar="98" /> </selector>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml new file mode 100644 index 000000000000..c400dc676325 --- /dev/null +++ b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml @@ -0,0 +1,699 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector android:height="30dp" android:width="30dp" android:viewportHeight="30" + android:viewportWidth="30"> + <group android:name="_R_G" android:scaleX="-1" android:translateX="30"> + <group android:name="_R_G_L_0_G" android:translateX="-135" android:translateY="-135" + android:pivotX="150" android:pivotY="150" android:scaleX="0.1" + android:scaleY="0.1"> + <group android:name="_R_G_L_0_G_L_1_G" android:translateX="134.624" + android:translateY="87.514" android:pivotX="11.625" android:pivotY="6.39" + android:scaleX="10" android:scaleY="10"> + <group android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0" + android:translateX="11.625" android:translateY="6.464" + android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_0_G_L_1_G_D_0_P_0" + android:fillColor="@color/letterbox_reachability_education_item_color" + android:fillAlpha="1" + android:fillType="nonZero" + android:pathData=" M-1.54 5.39 C-3.87,4.71 -5.49,2.54 -5.49,0.11 C-5.49,-2.92 -3.03,-5.38 0,-5.38 C3.03,-5.38 5.49,-2.92 5.49,0.11 C5.49,2.11 4.41,3.95 2.66,4.92 C2.66,4.92 1.69,3.17 1.69,3.17 C2.8,2.55 3.49,1.38 3.49,0.11 C3.49,-1.82 1.93,-3.38 0,-3.38 C-1.93,-3.38 -3.49,-1.82 -3.49,0.11 C-3.49,1.65 -2.46,3.03 -0.98,3.47 C-0.98,3.47 -1.54,5.39 -1.54,5.39c "/> + </group> + </group> + <group android:name="_R_G_L_0_G_L_0_G" android:translateX="138" + android:translateY="138" android:pivotX="12" android:pivotY="12" + android:scaleX="10" android:scaleY="10"> + <path android:name="_R_G_L_0_G_L_0_G_D_0_P_0" + android:fillColor="@color/letterbox_reachability_education_item_color" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c "/> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="fillAlpha" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="750" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="1083" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="2250" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="2583" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="3750" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="4083" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="5250" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="5583" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="1083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="1083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="2250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="2250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="2583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="2583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="3750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="3750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="4083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="4083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="5250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="5250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="5583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="5583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="pathData" android:duration="500" + android:startOffset="0" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="500" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="750" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="833" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="1083" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="1167" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="2000" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="2250" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="2333" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="2583" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="2667" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="3500" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="3750" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="3833" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="4083" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="4167" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="5000" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="5250" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="5333" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="5583" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateX" android:duration="6000" + android:startOffset="0" android:valueFrom="0" android:valueTo="1" + android:valueType="floatType"/> + </set> + </aapt:attr> + </target> +</animated-vector> diff --git a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml new file mode 100644 index 000000000000..a807a770aa22 --- /dev/null +++ b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml @@ -0,0 +1,699 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector android:height="30dp" android:width="30dp" android:viewportHeight="30" + android:viewportWidth="30"> + <group android:name="_R_G"> + <group android:name="_R_G_L_0_G" android:translateX="-135" android:translateY="-135" + android:pivotX="150" android:pivotY="150" android:scaleX="0.1" + android:scaleY="0.1"> + <group android:name="_R_G_L_0_G_L_1_G" android:translateX="134.624" + android:translateY="87.514" android:pivotX="11.625" android:pivotY="6.39" + android:scaleX="10" android:scaleY="10"> + <group android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0" + android:translateX="11.625" android:translateY="6.464" + android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_0_G_L_1_G_D_0_P_0" + android:fillColor="@color/letterbox_reachability_education_item_color" + android:fillAlpha="1" + android:fillType="nonZero" + android:pathData=" M-1.54 5.39 C-3.87,4.71 -5.49,2.54 -5.49,0.11 C-5.49,-2.92 -3.03,-5.38 0,-5.38 C3.03,-5.38 5.49,-2.92 5.49,0.11 C5.49,2.11 4.41,3.95 2.66,4.92 C2.66,4.92 1.69,3.17 1.69,3.17 C2.8,2.55 3.49,1.38 3.49,0.11 C3.49,-1.82 1.93,-3.38 0,-3.38 C-1.93,-3.38 -3.49,-1.82 -3.49,0.11 C-3.49,1.65 -2.46,3.03 -0.98,3.47 C-0.98,3.47 -1.54,5.39 -1.54,5.39c "/> + </group> + </group> + <group android:name="_R_G_L_0_G_L_0_G" android:translateX="138" + android:translateY="138" android:pivotX="12" android:pivotY="12" + android:scaleX="10" android:scaleY="10"> + <path android:name="_R_G_L_0_G_L_0_G_D_0_P_0" + android:fillColor="@color/letterbox_reachability_education_item_color" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c "/> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="fillAlpha" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="750" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="1083" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="2250" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="2583" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="3750" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="4083" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="5250" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="0.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="fillAlpha" android:duration="83" + android:startOffset="5583" android:valueFrom="0.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="500" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="1083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="1083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="1167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="2000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="2250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="2250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="2333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="2583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="2583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="2667" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="3500" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="3750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="3750" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="3833" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="4083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="4083" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="833" + android:startOffset="4167" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="5000" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="5250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="5250" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="5333" android:valueFrom="1" + android:valueTo="1.4000000000000001" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="5583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="5583" android:valueFrom="1.4000000000000001" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="pathData" android:duration="500" + android:startOffset="0" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="500" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="750" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="833" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="1083" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="1167" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="2000" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="2250" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="2333" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="2583" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="2667" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="3500" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="3750" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="3833" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="4083" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="833" + android:startOffset="4167" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="5000" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="5250" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="5333" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="83" + android:startOffset="5583" + android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateX" android:duration="6000" + android:startOffset="0" android:valueFrom="0" android:valueTo="1" + android:valueType="floatType"/> + </set> + </aapt:attr> + </target> +</animated-vector> diff --git a/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml b/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml new file mode 100644 index 000000000000..1e36fb62f8da --- /dev/null +++ b/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<com.android.wm.shell.compatui.ReachabilityEduLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:focusable="false" + android:focusableInTouchMode="false" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <com.android.wm.shell.compatui.ReachabilityEduHandLayout + style="@style/ReachabilityEduHandLayout" + android:text="@string/letterbox_reachability_reposition_text" + app:drawableTopCompat="@drawable/reachability_education_ic_right_hand" + android:layout_gravity="center_horizontal|top" + android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin" + android:id="@+id/reachability_move_up_button" + android:maxWidth="@dimen/letterbox_reachability_education_item_width" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + <com.android.wm.shell.compatui.ReachabilityEduHandLayout + style="@style/ReachabilityEduHandLayout" + android:text="@string/letterbox_reachability_reposition_text" + app:drawableTopCompat="@drawable/reachability_education_ic_right_hand" + android:layout_gravity="center_vertical|right" + android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin" + android:id="@+id/reachability_move_right_button" + android:maxWidth="@dimen/letterbox_reachability_education_item_width" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + + <com.android.wm.shell.compatui.ReachabilityEduHandLayout + style="@style/ReachabilityEduHandLayout" + android:text="@string/letterbox_reachability_reposition_text" + app:drawableTopCompat="@drawable/reachability_education_ic_left_hand" + android:layout_gravity="center_vertical|left" + android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin" + android:id="@+id/reachability_move_left_button" + android:maxWidth="@dimen/letterbox_reachability_education_item_width" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + <com.android.wm.shell.compatui.ReachabilityEduHandLayout + style="@style/ReachabilityEduHandLayout" + android:text="@string/letterbox_reachability_reposition_text" + app:drawableTopCompat="@drawable/reachability_education_ic_right_hand" + android:layout_gravity="center_horizontal|bottom" + android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin" + android:id="@+id/reachability_move_down_button" + android:maxWidth="@dimen/letterbox_reachability_education_item_width" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + +</com.android.wm.shell.compatui.ReachabilityEduLayout> diff --git a/libs/WindowManager/Shell/res/values-mr/strings_tv.xml b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml index 8a8977979217..89654d0a5750 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml @@ -24,7 +24,7 @@ <string name="pip_move" msgid="158770205886688553">"हलवा"</string> <string name="pip_expand" msgid="1051966011679297308">"विस्तार करा"</string> <string name="pip_collapse" msgid="3903295106641385962">"कोलॅप्स करा"</string> - <string name="pip_edu_text" msgid="7930546669915337998">"नियंत्रणांसाठी "<annotation icon="home_icon">"होम"</annotation>" दोनदा दाबा"</string> + <string name="pip_edu_text" msgid="7930546669915337998">"नियंत्रणांसाठी "<annotation icon="home_icon">"होम"</annotation>" दोनदा प्रेस करा"</string> <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"चित्रात-चित्र मेनू."</string> <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"डावीकडे हलवा"</string> <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"उजवीकडे हलवा"</string> diff --git a/libs/WindowManager/Shell/res/values/attrs.xml b/libs/WindowManager/Shell/res/values/attrs.xml index 2aad4c1c1805..fbb5caa508de 100644 --- a/libs/WindowManager/Shell/res/values/attrs.xml +++ b/libs/WindowManager/Shell/res/values/attrs.xml @@ -1,5 +1,5 @@ <!-- - ~ Copyright (C) 2022 The Android Open Source Project + ~ Copyright (C) 2023 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml index 2a03b03d86f1..4a1635d71c57 100644 --- a/libs/WindowManager/Shell/res/values/colors.xml +++ b/libs/WindowManager/Shell/res/values/colors.xml @@ -45,6 +45,9 @@ <!-- Letterbox Dialog --> <color name="letterbox_dialog_background">@android:color/system_neutral1_900</color> + <!-- Reachability Education color for hand icon and text--> + <color name="letterbox_reachability_education_item_color">#BFC8CC</color> + <!-- GM2 colors --> <color name="GM2_grey_200">#E8EAED</color> <color name="GM2_grey_700">#5F6368</color> diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index 88ca10d20521..c98a056c5986 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -327,6 +327,15 @@ <!-- The vertical padding for the buttons in the letterbox restart dialog --> <dimen name="letterbox_restart_dialog_vertical_padding">8dp</dimen> + <!-- The margin between the reachability dialog container and its parent. --> + <dimen name="letterbox_reachability_education_dialog_margin">16dp</dimen> + + <!-- The width of each item in the reachability education --> + <dimen name="letterbox_reachability_education_item_width">118dp</dimen> + + <!-- The size of the icon in the item of reachability education --> + <dimen name="letterbox_reachability_education_item_image_size">24dp</dimen> + <!-- The width of the brand image on staring surface. --> <dimen name="starting_surface_brand_image_width">200dp</dimen> diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml index 9f6cf79dcbc4..2b196caaab47 100644 --- a/libs/WindowManager/Shell/res/values/strings.xml +++ b/libs/WindowManager/Shell/res/values/strings.xml @@ -221,6 +221,17 @@ <!-- Checkbox text for asking to not show the restart confirmation dialog again. [CHAR LIMIT=NONE] --> <string name="letterbox_restart_dialog_checkbox_title">Don\u2019t show again</string> + <!-- When an app is letterboxed, it is initially centered on the screen but the user can + double tap to move the app to a different position. With a double-tap on the right, + the app moves the right of the screen and with a double-tap on the left the app moves + on the left. The same happens if the app has space to be moved to the top or bottom of + the screen. This time the double-tap can happen on the top or bottom of the screen. + To teach the user about this feature, we display an education explaining how the double-tap + works and how the app can be moved on the screen. + This is the text we show to the user below an animated icon visualizing the double-tap + action. [CHAR LIMIT=NONE] --> + <string name="letterbox_reachability_reposition_text">Double-tap to move this app</string> + <!-- Freeform window caption strings --> <!-- Accessibility text for the maximize window button [CHAR LIMIT=NONE] --> <string name="maximize_button_text">Maximize</string> diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml index bc2e71d1c013..d0782ad9b37e 100644 --- a/libs/WindowManager/Shell/res/values/styles.xml +++ b/libs/WindowManager/Shell/res/values/styles.xml @@ -144,4 +144,20 @@ @*android:string/config_bodyFontFamily </item> </style> + + <style name="ReachabilityEduHandLayout" parent="Theme.AppCompat"> + <item name="android:focusable">false</item> + <item name="android:focusableInTouchMode">false</item> + <item name="android:background">@android:color/transparent</item> + <item name="android:contentDescription">@string/restart_button_description</item> + <item name="android:visibility">invisible</item> + <item name="android:lineSpacingExtra">-1sp</item> + <item name="android:textSize">12sp</item> + <item name="android:textAlignment">center</item> + <item name="android:textColor">@color/letterbox_reachability_education_item_color</item> + <item name="android:textAppearance"> + @*android:style/TextAppearance.DeviceDefault.Body2 + </item> + </style> + </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java index 06f0a70d3d0f..4e10ce82f365 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java @@ -39,22 +39,41 @@ public class CompatUIConfiguration implements DeviceConfig.OnPropertiesChangedLi "enable_letterbox_restart_confirmation_dialog"; private static final String KEY_ENABLE_LETTERBOX_REACHABILITY_EDUCATION = - "enable_letterbox_reachability_education"; + "enable_letterbox_education_for_reachability"; private static final boolean DEFAULT_VALUE_ENABLE_LETTERBOX_RESTART_DIALOG = true; - private static final boolean DEFAULT_VALUE_ENABLE_LETTERBOX_REACHABILITY_EDUCATION = false; + private static final boolean DEFAULT_VALUE_ENABLE_LETTERBOX_REACHABILITY_EDUCATION = true; /** - * The name of the {@link SharedPreferences} that holds which user has seen the Restart - * confirmation dialog. + * The name of the {@link SharedPreferences} that holds information about compat ui. */ - private static final String DONT_SHOW_RESTART_DIALOG_PREF_NAME = "dont_show_restart_dialog"; + private static final String COMPAT_UI_SHARED_PREFERENCES = "dont_show_restart_dialog"; /** - * The {@link SharedPreferences} instance for {@link #DONT_SHOW_RESTART_DIALOG_PREF_NAME}. + * The name of the {@link SharedPreferences} that holds which user has seen the Letterbox + * Education dialog. */ - private final SharedPreferences mSharedPreferences; + private static final String HAS_SEEN_LETTERBOX_EDUCATION_SHARED_PREFERENCES = + "has_seen_letterbox_education"; + + /** + * Key prefix for the {@link SharedPreferences} entries related to the reachability + * education. + */ + private static final String HAS_SEEN_REACHABILITY_EDUCATION_KEY_PREFIX = + "has_seen_reachability_education"; + + /** + * The {@link SharedPreferences} instance for the restart dialog and the reachability + * education. + */ + private final SharedPreferences mCompatUISharedPreferences; + + /** + * The {@link SharedPreferences} instance for the letterbox education dialog. + */ + private final SharedPreferences mLetterboxEduSharedPreferences; // Whether the extended restart dialog is enabled private boolean mIsRestartDialogEnabled; @@ -88,8 +107,10 @@ public class CompatUIConfiguration implements DeviceConfig.OnPropertiesChangedLi DEFAULT_VALUE_ENABLE_LETTERBOX_REACHABILITY_EDUCATION); DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_APP_COMPAT, mainExecutor, this); - mSharedPreferences = context.getSharedPreferences(DONT_SHOW_RESTART_DIALOG_PREF_NAME, + mCompatUISharedPreferences = context.getSharedPreferences(getCompatUISharedPreferenceName(), Context.MODE_PRIVATE); + mLetterboxEduSharedPreferences = context.getSharedPreferences( + getHasSeenLetterboxEducationSharedPreferencedName(), Context.MODE_PRIVATE); } /** @@ -122,20 +143,51 @@ public class CompatUIConfiguration implements DeviceConfig.OnPropertiesChangedLi mIsReachabilityEducationOverrideEnabled = enabled; } - boolean getDontShowRestartDialogAgain(TaskInfo taskInfo) { - final int userId = taskInfo.userId; - final String packageName = taskInfo.topActivity.getPackageName(); - return mSharedPreferences.getBoolean( - getDontShowAgainRestartKey(userId, packageName), /* default= */ false); + void setDontShowRestartDialogAgain(TaskInfo taskInfo) { + mCompatUISharedPreferences.edit().putBoolean( + getDontShowAgainRestartKey(taskInfo.userId, taskInfo.topActivity.getPackageName()), + true).apply(); } - void setDontShowRestartDialogAgain(TaskInfo taskInfo) { - final int userId = taskInfo.userId; - final String packageName = taskInfo.topActivity.getPackageName(); - mSharedPreferences.edit().putBoolean(getDontShowAgainRestartKey(userId, packageName), + boolean shouldShowRestartDialogAgain(TaskInfo taskInfo) { + return !mCompatUISharedPreferences.getBoolean(getDontShowAgainRestartKey(taskInfo.userId, + taskInfo.topActivity.getPackageName()), /* default= */ false); + } + + void setDontShowReachabilityEducationAgain(TaskInfo taskInfo) { + mCompatUISharedPreferences.edit().putBoolean( + getDontShowAgainReachabilityEduKey(taskInfo.userId), true).apply(); + } + + boolean shouldShowReachabilityEducation(@NonNull TaskInfo taskInfo) { + return getHasSeenLetterboxEducation(taskInfo.userId) + && !mCompatUISharedPreferences.getBoolean( + getDontShowAgainReachabilityEduKey(taskInfo.userId), /* default= */false); + } + + boolean getHasSeenLetterboxEducation(int userId) { + return mLetterboxEduSharedPreferences + .getBoolean(getDontShowLetterboxEduKey(userId), /* default= */ false); + } + + void setSeenLetterboxEducation(int userId) { + mLetterboxEduSharedPreferences.edit().putBoolean(getDontShowLetterboxEduKey(userId), true).apply(); } + protected String getCompatUISharedPreferenceName() { + return COMPAT_UI_SHARED_PREFERENCES; + } + + protected String getHasSeenLetterboxEducationSharedPreferencedName() { + return HAS_SEEN_LETTERBOX_EDUCATION_SHARED_PREFERENCES; + } + + /** + * Updates the {@link DeviceConfig} state for the CompatUI + * @param properties Contains the complete collection of properties which have changed for a + * single namespace. This includes only those which were added, updated, + */ @Override public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { if (properties.getKeyset().contains(KEY_ENABLE_LETTERBOX_RESTART_DIALOG)) { @@ -152,6 +204,14 @@ public class CompatUIConfiguration implements DeviceConfig.OnPropertiesChangedLi } } + private static String getDontShowAgainReachabilityEduKey(int userId) { + return HAS_SEEN_REACHABILITY_EDUCATION_KEY_PREFIX + "@" + userId; + } + + private static String getDontShowLetterboxEduKey(int userId) { + return String.valueOf(userId); + } + private String getDontShowAgainRestartKey(int userId, String packageName) { return packageName + "@" + userId; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java index 6950f24512b1..4d83247e5c03 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java @@ -112,6 +112,12 @@ public class CompatUIController implements OnDisplaysChangedListener, @Nullable private LetterboxEduWindowManager mActiveLetterboxEduLayout; + /** + * The active Reachability UI layout. + */ + @Nullable + private ReachabilityEduWindowManager mActiveReachabilityEduLayout; + /** Avoid creating display context frequently for non-default display. */ private final SparseArray<WeakReference<Context>> mDisplayContextCache = new SparseArray<>(0); @@ -195,6 +201,7 @@ public class CompatUIController implements OnDisplaysChangedListener, createOrUpdateCompatLayout(taskInfo, taskListener); createOrUpdateLetterboxEduLayout(taskInfo, taskListener); createOrUpdateRestartDialogLayout(taskInfo, taskListener); + createOrUpdateReachabilityEduLayout(taskInfo, taskListener, false); } @Override @@ -308,7 +315,7 @@ public class CompatUIController implements OnDisplaysChangedListener, private void onRestartButtonClicked( Pair<TaskInfo, ShellTaskOrganizer.TaskListener> taskInfoState) { if (mCompatUIConfiguration.isRestartDialogEnabled() - && !mCompatUIConfiguration.getDontShowRestartDialogAgain( + && mCompatUIConfiguration.shouldShowRestartDialogAgain( taskInfoState.first)) { // We need to show the dialog mSetOfTaskIdsShowingRestartDialog.add(taskInfoState.first.taskId); @@ -355,13 +362,15 @@ public class CompatUIController implements OnDisplaysChangedListener, ShellTaskOrganizer.TaskListener taskListener) { return new LetterboxEduWindowManager(context, taskInfo, mSyncQueue, taskListener, mDisplayController.getDisplayLayout(taskInfo.displayId), - mTransitionsLazy.get(), - this::onLetterboxEduDismissed, - mDockStateReader); + mTransitionsLazy.get(), this::onLetterboxEduDismissed, mDockStateReader, + mCompatUIConfiguration); } - private void onLetterboxEduDismissed() { + private void onLetterboxEduDismissed( + Pair<TaskInfo, ShellTaskOrganizer.TaskListener> stateInfo) { mActiveLetterboxEduLayout = null; + // We need to update the UI + createOrUpdateReachabilityEduLayout(stateInfo.first, stateInfo.second, true); } private void createOrUpdateRestartDialogLayout(TaskInfo taskInfo, @@ -419,6 +428,47 @@ public class CompatUIController implements OnDisplaysChangedListener, onCompatInfoChanged(stateInfo.first, stateInfo.second); } + private void createOrUpdateReachabilityEduLayout(TaskInfo taskInfo, + ShellTaskOrganizer.TaskListener taskListener, boolean forceUpdate) { + if (mActiveReachabilityEduLayout != null) { + mActiveReachabilityEduLayout.forceUpdate(forceUpdate); + // UI already exists, update the UI layout. + if (!mActiveReachabilityEduLayout.updateCompatInfo(taskInfo, taskListener, + showOnDisplay(mActiveReachabilityEduLayout.getDisplayId()))) { + // The layout is no longer eligible to be shown, remove from active layouts. + mActiveReachabilityEduLayout = null; + } + return; + } + // Create a new UI layout. + final Context context = getOrCreateDisplayContext(taskInfo.displayId); + if (context == null) { + return; + } + ReachabilityEduWindowManager newLayout = createReachabilityEduWindowManager(context, + taskInfo, taskListener); + if (newLayout.createLayout(showOnDisplay(taskInfo.displayId))) { + // The new layout is eligible to be shown, make it the active layout. + if (mActiveReachabilityEduLayout != null) { + // Release the previous layout since at most one can be active. + // Since letterbox reachability education is only shown once to the user, + // releasing the previous layout is only a precaution. + mActiveReachabilityEduLayout.release(); + } + mActiveReachabilityEduLayout = newLayout; + } + } + + @VisibleForTesting + ReachabilityEduWindowManager createReachabilityEduWindowManager(Context context, + TaskInfo taskInfo, + ShellTaskOrganizer.TaskListener taskListener) { + return new ReachabilityEduWindowManager(context, taskInfo, mSyncQueue, mCallback, + taskListener, mDisplayController.getDisplayLayout(taskInfo.displayId), + mCompatUIConfiguration, mMainExecutor); + } + + private void removeLayouts(int taskId) { final CompatUIWindowManager layout = mActiveCompatLayouts.get(taskId); if (layout != null) { @@ -438,6 +488,11 @@ public class CompatUIController implements OnDisplaysChangedListener, mTaskIdToRestartDialogWindowManagerMap.remove(taskId); mSetOfTaskIdsShowingRestartDialog.remove(taskId); } + if (mActiveReachabilityEduLayout != null + && mActiveReachabilityEduLayout.getTaskId() == taskId) { + mActiveReachabilityEduLayout.release(); + mActiveReachabilityEduLayout = null; + } } private Context getOrCreateDisplayContext(int displayId) { @@ -490,6 +545,9 @@ public class CompatUIController implements OnDisplaysChangedListener, callback.accept(layout); } } + if (mActiveReachabilityEduLayout != null && condition.test(mActiveReachabilityEduLayout)) { + callback.accept(mActiveReachabilityEduLayout); + } } /** An implementation of {@link OnInsetsChangedListener} for a given display id. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java index d44b4d8f63b6..f65c26ada04d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java @@ -21,6 +21,7 @@ import android.app.TaskInfo; import android.app.TaskInfo.CameraCompatControlState; import android.content.Context; import android.util.AttributeSet; +import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.LinearLayout; @@ -112,6 +113,14 @@ class CompatUILayout extends LinearLayout { } @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mWindowManager.relayout(); + } + return super.onInterceptTouchEvent(ev); + } + + @Override protected void onFinishInflate() { super.onFinishInflate(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java index b22c9c7e7529..9c4e79cd631b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java @@ -384,7 +384,7 @@ public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowMana // Cannot be wrap_content as this determines the actual window size width, height, TYPE_APPLICATION_OVERLAY, - FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, + getWindowManagerLayoutParamsFlags(), PixelFormat.TRANSLUCENT); winParams.token = new Binder(); winParams.setTitle(getClass().getSimpleName() + mTaskId); @@ -392,6 +392,13 @@ public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowMana return winParams; } + /** + * @return Flags to use for the {@link WindowManager} layout + */ + protected int getWindowManagerLayoutParamsFlags() { + return FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL; + } + protected final String getTag() { return getClass().getSimpleName(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java index bfdbfe3d6ea0..0c21c8ccd686 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java @@ -18,12 +18,13 @@ package com.android.wm.shell.compatui; import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.TaskInfo; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Rect; import android.provider.Settings; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; @@ -38,10 +39,12 @@ import com.android.wm.shell.common.DockStateReader; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.transition.Transitions; +import java.util.function.Consumer; + /** * Window manager for the Letterbox Education. */ -public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { +class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { /** * The Letterbox Education should be the topmost child of the Task in case there can be more @@ -49,19 +52,6 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { */ public static final int Z_ORDER = Integer.MAX_VALUE; - /** - * The name of the {@link SharedPreferences} that holds which user has seen the Letterbox - * Education dialog. - */ - @VisibleForTesting - static final String HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME = - "has_seen_letterbox_education"; - - /** - * The {@link SharedPreferences} instance for {@link #HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME}. - */ - private final SharedPreferences mSharedPreferences; - private final DialogAnimationController<LetterboxEduDialogLayout> mAnimationController; private final Transitions mTransitions; @@ -73,6 +63,10 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { */ private final int mUserId; + private final Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> mOnDismissCallback; + + private final CompatUIConfiguration mCompatUIConfiguration; + // Remember the last reported state in case visibility changes due to keyguard or IME updates. private boolean mEligibleForLetterboxEducation; @@ -80,7 +74,8 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { @VisibleForTesting LetterboxEduDialogLayout mLayout; - private final Runnable mOnDismissCallback; + @NonNull + private TaskInfo mTaskInfo; /** * The vertical margin between the dialog container and the task stable bounds (excluding @@ -90,33 +85,35 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { private final DockStateReader mDockStateReader; - public LetterboxEduWindowManager(Context context, TaskInfo taskInfo, + LetterboxEduWindowManager(Context context, TaskInfo taskInfo, SyncTransactionQueue syncQueue, ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout, Transitions transitions, - Runnable onDismissCallback, DockStateReader dockStateReader) { + Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> onDismissCallback, + DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration) { this(context, taskInfo, syncQueue, taskListener, displayLayout, transitions, onDismissCallback, new DialogAnimationController<>(context, /* tag */ "LetterboxEduWindowManager"), - dockStateReader); + dockStateReader, compatUIConfiguration); } @VisibleForTesting LetterboxEduWindowManager(Context context, TaskInfo taskInfo, SyncTransactionQueue syncQueue, ShellTaskOrganizer.TaskListener taskListener, - DisplayLayout displayLayout, Transitions transitions, Runnable onDismissCallback, + DisplayLayout displayLayout, Transitions transitions, + Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> onDismissCallback, DialogAnimationController<LetterboxEduDialogLayout> animationController, - DockStateReader dockStateReader) { + DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration) { super(context, taskInfo, syncQueue, taskListener, displayLayout); + mTaskInfo = taskInfo; mTransitions = transitions; mOnDismissCallback = onDismissCallback; mAnimationController = animationController; mUserId = taskInfo.userId; - mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation; - mSharedPreferences = mContext.getSharedPreferences(HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME, - Context.MODE_PRIVATE); mDialogVerticalMargin = (int) mContext.getResources().getDimension( R.dimen.letterbox_education_dialog_margin); mDockStateReader = dockStateReader; + mCompatUIConfiguration = compatUIConfiguration; + mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation; } @Override @@ -142,8 +139,8 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { // the controller will create a new instance of this class since this one isn't eligible). // - If the layout isn't null then it was previously showing, and we shouldn't check if the // user has seen the letterbox education before. - return mEligibleForLetterboxEducation && !isTaskbarEduShowing() - && (mLayout != null || !getHasSeenLetterboxEducation()) + return mEligibleForLetterboxEducation && !isTaskbarEduShowing() && (mLayout != null + || !mCompatUIConfiguration.getHasSeenLetterboxEducation(mUserId)) && !mDockStateReader.isDocked(); } @@ -192,7 +189,6 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { // Dialog has already been released. return; } - setSeenLetterboxEducation(); mLayout.setDismissOnClickListener(this::onDismiss); // Focus on the dialog title for accessibility. mLayout.getDialogTitle().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); @@ -202,10 +198,11 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { if (mLayout == null) { return; } + mCompatUIConfiguration.setSeenLetterboxEducation(mUserId); mLayout.setDismissOnClickListener(null); mAnimationController.startExitAnimation(mLayout, () -> { release(); - mOnDismissCallback.run(); + mOnDismissCallback.accept(Pair.create(mTaskInfo, getTaskListener())); }); } @@ -218,6 +215,7 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { @Override public boolean updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener, boolean canShow) { + mTaskInfo = taskInfo; mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation; return super.updateCompatInfo(taskInfo, taskListener, canShow); @@ -248,18 +246,6 @@ public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { taskBounds.height()); } - private boolean getHasSeenLetterboxEducation() { - return mSharedPreferences.getBoolean(getPrefKey(), /* default= */ false); - } - - private void setSeenLetterboxEducation() { - mSharedPreferences.edit().putBoolean(getPrefKey(), true).apply(); - } - - private String getPrefKey() { - return String.valueOf(mUserId); - } - @VisibleForTesting boolean isTaskbarEduShowing() { return Settings.Secure.getInt(mContext.getContentResolver(), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java new file mode 100644 index 000000000000..6081ef1ca307 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.compatui; + +import android.content.Context; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; + +import androidx.appcompat.widget.AppCompatTextView; + +/** + * Custom layout for Reachability Education hand. + */ +public class ReachabilityEduHandLayout extends AppCompatTextView { + + private Drawable mHandDrawable; + + public ReachabilityEduHandLayout(Context context) { + this(context, null); + } + + public ReachabilityEduHandLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ReachabilityEduHandLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mHandDrawable = getCompoundDrawables()[/* top */ 1]; + } + + void hide() { + stopAnimation(); + setAlpha(0); + setVisibility(View.INVISIBLE); + } + + void startAnimation() { + if (mHandDrawable instanceof Animatable) { + final Animatable animatedBg = (Animatable) mHandDrawable; + animatedBg.start(); + } + } + + void stopAnimation() { + if (mHandDrawable instanceof Animatable) { + final Animatable animatedBg = (Animatable) mHandDrawable; + animatedBg.stop(); + } + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java new file mode 100644 index 000000000000..6a72d28521b8 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.compatui; + +import android.animation.Animator; +import android.animation.ValueAnimator; +import android.app.TaskInfo; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.widget.FrameLayout; + +import com.android.wm.shell.R; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +/** + * Container for reachability education which handles all the show/hide animations. + */ +public class ReachabilityEduLayout extends FrameLayout { + + private static final float ALPHA_FULL_TRANSPARENT = 0f; + + private static final float ALPHA_FULL_OPAQUE = 1f; + + private static final long VISIBILITY_SHOW_ANIMATION_DURATION_MS = 167; + + private static final long VISIBILITY_SHOW_ANIMATION_DELAY_MS = 250; + + private static final long VISIBILITY_SHOW_DOUBLE_TAP_ANIMATION_DELAY_MS = 80; + + private static final long MARGINS_ANIMATION_DURATION_MS = 250; + + private ReachabilityEduWindowManager mWindowManager; + + private ReachabilityEduHandLayout mMoveLeftButton; + private ReachabilityEduHandLayout mMoveRightButton; + private ReachabilityEduHandLayout mMoveUpButton; + private ReachabilityEduHandLayout mMoveDownButton; + + private int mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET; + private int mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET; + private int mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET; + private int mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET; + + private boolean mIsLayoutActive; + + public ReachabilityEduLayout(Context context) { + this(context, null); + } + + public ReachabilityEduLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ReachabilityEduLayout(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public ReachabilityEduLayout(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + void inject(ReachabilityEduWindowManager windowManager) { + mWindowManager = windowManager; + } + + void handleVisibility(boolean isActivityLetterboxed, int letterboxVerticalPosition, + int letterboxHorizontalPosition, int availableWidth, int availableHeight, + boolean isDoubleTap) { + // If the app is not letterboxed we hide all the buttons. + if (!mIsLayoutActive || !isActivityLetterboxed || ( + letterboxHorizontalPosition == TaskInfo.PROPERTY_VALUE_UNSET + && letterboxVerticalPosition == TaskInfo.PROPERTY_VALUE_UNSET)) { + hideAllImmediately(); + } else if (letterboxHorizontalPosition != TaskInfo.PROPERTY_VALUE_UNSET) { + handleLetterboxHorizontalPosition(availableWidth, letterboxHorizontalPosition, + isDoubleTap); + } else { + handleLetterboxVerticalPosition(availableHeight, letterboxVerticalPosition, + isDoubleTap); + } + } + + void hideAllImmediately() { + mMoveLeftButton.hide(); + mMoveRightButton.hide(); + mMoveUpButton.hide(); + mMoveDownButton.hide(); + mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET; + mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET; + mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET; + mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET; + } + + void setIsLayoutActive(boolean isLayoutActive) { + this.mIsLayoutActive = isLayoutActive; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mMoveLeftButton = findViewById(R.id.reachability_move_left_button); + mMoveRightButton = findViewById(R.id.reachability_move_right_button); + mMoveUpButton = findViewById(R.id.reachability_move_up_button); + mMoveDownButton = findViewById(R.id.reachability_move_down_button); + mMoveLeftButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + mMoveRightButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + mMoveUpButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + mMoveDownButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + } + + private Animator marginAnimator(View view, Function<LayoutParams, Integer> marginSupplier, + BiConsumer<LayoutParams, Integer> marginConsumer, int from, int to) { + final LayoutParams layoutParams = ((LayoutParams) view.getLayoutParams()); + ValueAnimator animator = ValueAnimator.ofInt(marginSupplier.apply(layoutParams), from, to); + animator.addUpdateListener(valueAnimator -> { + marginConsumer.accept(layoutParams, (Integer) valueAnimator.getAnimatedValue()); + view.requestLayout(); + }); + animator.setDuration(MARGINS_ANIMATION_DURATION_MS); + return animator; + } + + private void handleLetterboxHorizontalPosition(int availableWidth, + int letterboxHorizontalPosition, boolean isDoubleTap) { + mMoveUpButton.hide(); + mMoveDownButton.hide(); + mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET; + mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET; + // We calculate the available space on the left and right + final int horizontalGap = availableWidth / 2; + final int leftAvailableSpace = letterboxHorizontalPosition * horizontalGap; + final int rightAvailableSpace = availableWidth - leftAvailableSpace; + // We show the button if we have enough space + if (leftAvailableSpace >= mMoveLeftButton.getMeasuredWidth()) { + int newLeftMargin = (horizontalGap - mMoveLeftButton.getMeasuredWidth()) / 2; + if (mLastLeftMargin == TaskInfo.PROPERTY_VALUE_UNSET) { + mLastLeftMargin = newLeftMargin; + } + if (mLastLeftMargin != newLeftMargin) { + marginAnimator(mMoveLeftButton, layoutParams -> layoutParams.leftMargin, + (layoutParams, margin) -> layoutParams.leftMargin = margin, + mLastLeftMargin, newLeftMargin).start(); + } else { + final LayoutParams leftParams = ((LayoutParams) mMoveLeftButton.getLayoutParams()); + leftParams.leftMargin = mLastLeftMargin; + mMoveLeftButton.setLayoutParams(leftParams); + } + showItem(mMoveLeftButton, isDoubleTap); + } else { + mMoveLeftButton.hide(); + mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET; + } + if (rightAvailableSpace >= mMoveRightButton.getMeasuredWidth()) { + int newRightMargin = (horizontalGap - mMoveRightButton.getMeasuredWidth()) / 2; + if (mLastRightMargin == TaskInfo.PROPERTY_VALUE_UNSET) { + mLastRightMargin = newRightMargin; + } + if (mLastRightMargin != newRightMargin) { + marginAnimator(mMoveRightButton, layoutParams -> layoutParams.rightMargin, + (layoutParams, margin) -> layoutParams.rightMargin = margin, + mLastRightMargin, newRightMargin).start(); + } else { + final LayoutParams rightParams = + ((LayoutParams) mMoveRightButton.getLayoutParams()); + rightParams.rightMargin = mLastRightMargin; + mMoveRightButton.setLayoutParams(rightParams); + } + showItem(mMoveRightButton, isDoubleTap); + } else { + mMoveRightButton.hide(); + mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET; + } + } + + private void handleLetterboxVerticalPosition(int availableHeight, + int letterboxVerticalPosition, boolean isDoubleTap) { + mMoveLeftButton.hide(); + mMoveRightButton.hide(); + mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET; + mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET; + // We calculate the available space on the left and right + final int verticalGap = availableHeight / 2; + final int topAvailableSpace = letterboxVerticalPosition * verticalGap; + final int bottomAvailableSpace = availableHeight - topAvailableSpace; + if (topAvailableSpace >= mMoveUpButton.getMeasuredHeight()) { + int newTopMargin = (verticalGap - mMoveUpButton.getMeasuredHeight()) / 2; + if (mLastTopMargin == TaskInfo.PROPERTY_VALUE_UNSET) { + mLastTopMargin = newTopMargin; + } + if (mLastTopMargin != newTopMargin) { + marginAnimator(mMoveUpButton, layoutParams -> layoutParams.topMargin, + (layoutParams, margin) -> layoutParams.topMargin = margin, + mLastTopMargin, newTopMargin).start(); + } else { + final LayoutParams topParams = ((LayoutParams) mMoveUpButton.getLayoutParams()); + topParams.topMargin = mLastTopMargin; + mMoveUpButton.setLayoutParams(topParams); + } + showItem(mMoveUpButton, isDoubleTap); + } else { + mMoveUpButton.hide(); + mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET; + } + if (bottomAvailableSpace >= mMoveDownButton.getMeasuredHeight()) { + int newBottomMargin = (verticalGap - mMoveDownButton.getMeasuredHeight()) / 2; + if (mLastBottomMargin == TaskInfo.PROPERTY_VALUE_UNSET) { + mLastBottomMargin = newBottomMargin; + } + if (mLastBottomMargin != newBottomMargin) { + marginAnimator(mMoveDownButton, layoutParams -> layoutParams.bottomMargin, + (layoutParams, margin) -> layoutParams.bottomMargin = margin, + mLastBottomMargin, newBottomMargin).start(); + } else { + final LayoutParams bottomParams = + ((LayoutParams) mMoveDownButton.getLayoutParams()); + bottomParams.bottomMargin = mLastBottomMargin; + mMoveDownButton.setLayoutParams(bottomParams); + } + showItem(mMoveDownButton, isDoubleTap); + } else { + mMoveDownButton.hide(); + mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET; + } + } + + private void showItem(ReachabilityEduHandLayout view, boolean fromDoubleTap) { + if (view.getVisibility() == View.VISIBLE) { + // Already visible we just start animation + view.startAnimation(); + return; + } + view.setVisibility(View.VISIBLE); + final long delay = fromDoubleTap ? VISIBILITY_SHOW_DOUBLE_TAP_ANIMATION_DELAY_MS + : VISIBILITY_SHOW_ANIMATION_DELAY_MS; + AlphaAnimation alphaAnimation = new AlphaAnimation(ALPHA_FULL_TRANSPARENT, + ALPHA_FULL_OPAQUE); + alphaAnimation.setDuration(VISIBILITY_SHOW_ANIMATION_DURATION_MS); + alphaAnimation.setStartOffset(delay); + alphaAnimation.setFillAfter(true); + alphaAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + // We trigger the hand animation + view.setAlpha(ALPHA_FULL_OPAQUE); + view.startAnimation(); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + view.startAnimation(alphaAnimation); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java new file mode 100644 index 000000000000..f1b098ef27c7 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.compatui; + +import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.TaskInfo; +import android.content.Context; +import android.graphics.Rect; +import android.os.SystemClock; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.wm.shell.R; +import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.common.DisplayLayout; +import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.compatui.CompatUIController.CompatUICallback; + +/** + * Window manager for the reachability education + */ +class ReachabilityEduWindowManager extends CompatUIWindowManagerAbstract { + + /** + * The Compat UI should be below the Letterbox Education. + */ + private static final int Z_ORDER = LetterboxEduWindowManager.Z_ORDER - 1; + + // The time to wait before hiding the education + private static final long DISAPPEAR_DELAY_MS = 4000L; + + private final CompatUICallback mCallback; + + private final CompatUIConfiguration mCompatUIConfiguration; + + private final ShellExecutor mMainExecutor; + + @NonNull + private TaskInfo mTaskInfo; + + private boolean mIsActivityLetterboxed; + + private int mLetterboxVerticalPosition; + + private int mLetterboxHorizontalPosition; + + private int mTopActivityLetterboxWidth; + + private int mTopActivityLetterboxHeight; + + private long mNextHideTime = -1L; + + private boolean mForceUpdate = false; + + // We decided to force the visualization of the double-tap animated icons every time the user + // double-taps. + private boolean mHasUserDoubleTapped; + + // When the size of the letterboxed app changes and the icons are visible + // we need to animate them. + private boolean mHasLetterboxSizeChanged; + + @Nullable + @VisibleForTesting + ReachabilityEduLayout mLayout; + + ReachabilityEduWindowManager(Context context, TaskInfo taskInfo, + SyncTransactionQueue syncQueue, CompatUICallback callback, + ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout, + CompatUIConfiguration compatUIConfiguration, ShellExecutor mainExecutor) { + super(context, taskInfo, syncQueue, taskListener, displayLayout); + mCallback = callback; + mTaskInfo = taskInfo; + mIsActivityLetterboxed = taskInfo.isLetterboxDoubleTapEnabled; + mLetterboxVerticalPosition = taskInfo.topActivityLetterboxVerticalPosition; + mLetterboxHorizontalPosition = taskInfo.topActivityLetterboxHorizontalPosition; + mTopActivityLetterboxWidth = taskInfo.topActivityLetterboxWidth; + mTopActivityLetterboxHeight = taskInfo.topActivityLetterboxHeight; + mCompatUIConfiguration = compatUIConfiguration; + mMainExecutor = mainExecutor; + } + + @Override + protected int getZOrder() { + return Z_ORDER; + } + + @Override + protected @Nullable View getLayout() { + return mLayout; + } + + @Override + protected void removeLayout() { + mLayout = null; + } + + @Override + protected boolean eligibleToShowLayout() { + return mCompatUIConfiguration.isReachabilityEducationEnabled() + && mIsActivityLetterboxed + && (mLetterboxVerticalPosition != -1 || mLetterboxHorizontalPosition != -1); + } + + @Override + protected View createLayout() { + mLayout = inflateLayout(); + mLayout.inject(this); + + updateVisibilityOfViews(); + + return mLayout; + } + + @VisibleForTesting + ReachabilityEduLayout inflateLayout() { + return (ReachabilityEduLayout) LayoutInflater.from(mContext).inflate( + R.layout.reachability_ui_layout, null); + } + + @Override + public boolean updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener, + boolean canShow) { + mTaskInfo = taskInfo; + final boolean prevIsActivityLetterboxed = mIsActivityLetterboxed; + final int prevLetterboxVerticalPosition = mLetterboxVerticalPosition; + final int prevLetterboxHorizontalPosition = mLetterboxHorizontalPosition; + final int prevTopActivityLetterboxWidth = mTopActivityLetterboxWidth; + final int prevTopActivityLetterboxHeight = mTopActivityLetterboxHeight; + mIsActivityLetterboxed = taskInfo.isLetterboxDoubleTapEnabled; + mLetterboxVerticalPosition = taskInfo.topActivityLetterboxVerticalPosition; + mLetterboxHorizontalPosition = taskInfo.topActivityLetterboxHorizontalPosition; + mTopActivityLetterboxWidth = taskInfo.topActivityLetterboxWidth; + mTopActivityLetterboxHeight = taskInfo.topActivityLetterboxHeight; + mHasUserDoubleTapped = taskInfo.isFromLetterboxDoubleTap; + + if (taskInfo.isFromLetterboxDoubleTap) { + // In this case we disable the reachability for the following launch of + // the current application. Anyway because a double tap event happened, + // the reachability education is displayed + mCompatUIConfiguration.setDontShowReachabilityEducationAgain(taskInfo); + } + if (!super.updateCompatInfo(taskInfo, taskListener, canShow)) { + return false; + } + + mHasLetterboxSizeChanged = prevTopActivityLetterboxWidth != mTopActivityLetterboxWidth + || prevTopActivityLetterboxHeight != mTopActivityLetterboxHeight; + + if (mForceUpdate || prevIsActivityLetterboxed != mIsActivityLetterboxed + || prevLetterboxVerticalPosition != mLetterboxVerticalPosition + || prevLetterboxHorizontalPosition != mLetterboxHorizontalPosition + || prevTopActivityLetterboxWidth != mTopActivityLetterboxWidth + || prevTopActivityLetterboxHeight != mTopActivityLetterboxHeight) { + updateVisibilityOfViews(); + mForceUpdate = false; + } + + return true; + } + + void forceUpdate(boolean forceUpdate) { + mForceUpdate = forceUpdate; + } + + @Override + protected void onParentBoundsChanged() { + if (mLayout == null) { + return; + } + // Both the layout dimensions and dialog margins depend on the parent bounds. + WindowManager.LayoutParams windowLayoutParams = getWindowLayoutParams(); + mLayout.setLayoutParams(windowLayoutParams); + relayout(windowLayoutParams); + } + + /** Gets the layout params. */ + protected WindowManager.LayoutParams getWindowLayoutParams() { + View layout = getLayout(); + if (layout == null) { + return new WindowManager.LayoutParams(); + } + // Measure how big the hint is since its size depends on the text size. + final Rect taskBounds = getTaskBounds(); + layout.measure(View.MeasureSpec.makeMeasureSpec(taskBounds.width(), + View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(taskBounds.height(), + View.MeasureSpec.EXACTLY)); + return getWindowLayoutParams(layout.getMeasuredWidth(), layout.getMeasuredHeight()); + } + + /** + * @return Flags to use for the WindowManager layout + */ + @Override + protected int getWindowManagerLayoutParamsFlags() { + return FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE; + } + + @Override + @VisibleForTesting + public void updateSurfacePosition() { + if (mLayout == null) { + return; + } + updateSurfacePosition(0, 0); + } + + void updateHideTime() { + mNextHideTime = SystemClock.uptimeMillis() + DISAPPEAR_DELAY_MS; + } + + private void updateVisibilityOfViews() { + if (mLayout == null) { + return; + } + if (shouldUpdateEducation()) { + if (!mHasLetterboxSizeChanged) { + mLayout.setIsLayoutActive(true); + } + int availableWidth = getTaskBounds().width() - mTopActivityLetterboxWidth; + int availableHeight = getTaskBounds().height() - mTopActivityLetterboxHeight; + mLayout.handleVisibility(mIsActivityLetterboxed, mLetterboxVerticalPosition, + mLetterboxHorizontalPosition, availableWidth, availableHeight, + mHasUserDoubleTapped); + if (!mHasLetterboxSizeChanged) { + updateHideTime(); + mMainExecutor.executeDelayed(this::hideReachability, DISAPPEAR_DELAY_MS); + } + mHasUserDoubleTapped = false; + } else { + hideReachability(); + } + } + + private void hideReachability() { + if (mLayout != null) { + mLayout.setIsLayoutActive(false); + } + if (mLayout == null || !shouldHideEducation()) { + return; + } + mLayout.hideAllImmediately(); + // We need this in case the icons disappear after the timeout without an explicit + // double tap of the user. + mCompatUIConfiguration.setDontShowReachabilityEducationAgain(mTaskInfo); + } + + private boolean shouldUpdateEducation() { + return mForceUpdate || mHasUserDoubleTapped || mHasLetterboxSizeChanged + || mCompatUIConfiguration.shouldShowReachabilityEducation(mTaskInfo); + } + + private boolean shouldHideEducation() { + return SystemClock.uptimeMillis() >= mNextHideTime; + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java index 2440838844c4..aab123a843ea 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java @@ -130,7 +130,7 @@ class RestartDialogWindowManager extends CompatUIWindowManagerAbstract { protected boolean eligibleToShowLayout() { // We don't show this dialog if the user has explicitly selected so clicking on a checkbox. return mRequestRestartDialog && !isTaskbarEduShowing() && (mLayout != null - || !mCompatUIConfiguration.getDontShowRestartDialogAgain(mTaskInfo)); + || mCompatUIConfiguration.shouldShowRestartDialogAgain(mTaskInfo)); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index eb7c32fe8227..f8743ed23aaa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -54,6 +54,7 @@ import com.android.wm.shell.desktopmode.DesktopModeController; import com.android.wm.shell.desktopmode.DesktopModeStatus; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.DesktopTasksController; +import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler; import com.android.wm.shell.draganddrop.DragAndDropController; import com.android.wm.shell.freeform.FreeformComponents; import com.android.wm.shell.freeform.FreeformTaskListener; @@ -676,12 +677,20 @@ public abstract class WMShellModule { SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, Transitions transitions, + EnterDesktopTaskTransitionHandler transitionHandler, @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository, @ShellMainThread ShellExecutor mainExecutor ) { return new DesktopTasksController(context, shellInit, shellController, displayController, shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, transitions, - desktopModeTaskRepository, mainExecutor); + transitionHandler, desktopModeTaskRepository, mainExecutor); + } + + @WMSingleton + @Provides + static EnterDesktopTaskTransitionHandler provideEnterDesktopModeTaskTransitionHandler( + Transitions transitions) { + return new EnterDesktopTaskTransitionHandler(transitions); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java index ad334b5f2dc8..2bdbde1b71d4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java @@ -312,6 +312,20 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll } /** + * Moves a specifc task to the front. + * @param taskInfo the task to show in front. + */ + public void moveTaskToFront(RunningTaskInfo taskInfo) { + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.reorder(taskInfo.token, true /* onTop */); + if (Transitions.ENABLE_SHELL_TRANSITIONS) { + mTransitions.startTransition(TRANSIT_TO_FRONT, wct, null); + } else { + mShellTaskOrganizer.applyTransaction(wct); + } + } + + /** * Turn desktop mode on or off * @param active the desired state for desktop mode setting */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 5696dfc5069e..cb04a43e7205 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -25,6 +25,7 @@ import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED import android.app.WindowConfiguration.WindowingMode import android.content.Context +import android.graphics.Rect import android.os.IBinder import android.os.SystemProperties import android.view.SurfaceControl @@ -67,6 +68,7 @@ class DesktopTasksController( private val syncQueue: SyncTransactionQueue, private val rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, private val transitions: Transitions, + private val animationTransitionHandler: EnterDesktopTaskTransitionHandler, private val desktopModeTaskRepository: DesktopModeTaskRepository, @ShellMainThread private val mainExecutor: ShellExecutor ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler { @@ -133,6 +135,44 @@ class DesktopTasksController( } } + /** + * Moves a single task to freeform and sets the taskBounds to the passed in bounds, + * startBounds + */ + fun moveToFreeform( + taskInfo: RunningTaskInfo, + startBounds: Rect + ) { + val wct = WindowContainerTransaction() + moveHomeTaskToFront(wct) + addMoveToDesktopChanges(wct, taskInfo.getToken()) + wct.setBounds(taskInfo.token, startBounds) + + if (Transitions.ENABLE_SHELL_TRANSITIONS) { + animationTransitionHandler.startTransition( + Transitions.TRANSIT_ENTER_FREEFORM, wct) + } else { + shellTaskOrganizer.applyTransaction(wct) + } + } + + /** Brings apps to front and sets freeform task bounds */ + fun moveToDesktopWithAnimation( + taskInfo: RunningTaskInfo, + freeformBounds: Rect + ) { + val wct = WindowContainerTransaction() + bringDesktopAppsToFront(wct) + addMoveToDesktopChanges(wct, taskInfo.getToken()) + wct.setBounds(taskInfo.token, freeformBounds) + + if (Transitions.ENABLE_SHELL_TRANSITIONS) { + animationTransitionHandler.startTransition(Transitions.TRANSIT_ENTER_DESKTOP_MODE, wct) + } else { + shellTaskOrganizer.applyTransaction(wct) + } + } + /** Move a task with given `taskId` to fullscreen */ fun moveToFullscreen(taskId: Int) { shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task -> moveToFullscreen(task) } @@ -151,6 +191,17 @@ class DesktopTasksController( } } + /** Move a task to the front **/ + fun moveTaskToFront(taskInfo: ActivityManager.RunningTaskInfo) { + val wct = WindowContainerTransaction() + wct.reorder(taskInfo.token, true) + if (Transitions.ENABLE_SHELL_TRANSITIONS) { + transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */) + } else { + shellTaskOrganizer.applyTransaction(wct) + } + } + /** * Get windowing move for a given `taskId` * diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java new file mode 100644 index 000000000000..3df2340d4524 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.desktopmode; + +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.app.ActivityManager; +import android.graphics.Rect; +import android.os.IBinder; +import android.view.SurfaceControl; +import android.view.WindowManager; +import android.window.TransitionInfo; +import android.window.TransitionRequestInfo; +import android.window.WindowContainerTransaction; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.wm.shell.transition.Transitions; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * The {@link Transitions.TransitionHandler} that handles transitions for desktop mode tasks + * entering and exiting freeform. + */ +public class EnterDesktopTaskTransitionHandler implements Transitions.TransitionHandler { + + private final Transitions mTransitions; + private final Supplier<SurfaceControl.Transaction> mTransactionSupplier; + + // The size of the screen during drag relative to the fullscreen size + public static final float DRAG_FREEFORM_SCALE = 0.4f; + // The size of the screen after drag relative to the fullscreen size + public static final float FINAL_FREEFORM_SCALE = 0.6f; + public static final int FREEFORM_ANIMATION_DURATION = 336; + + private final List<IBinder> mPendingTransitionTokens = new ArrayList<>(); + + public EnterDesktopTaskTransitionHandler( + Transitions transitions) { + this(transitions, SurfaceControl.Transaction::new); + } + + public EnterDesktopTaskTransitionHandler( + Transitions transitions, + Supplier<SurfaceControl.Transaction> supplier) { + mTransitions = transitions; + mTransactionSupplier = supplier; + } + + /** + * Starts Transition of a given type + * @param type Transition type + * @param wct WindowContainerTransaction for transition + */ + public void startTransition(@WindowManager.TransitionType int type, + @NonNull WindowContainerTransaction wct) { + final IBinder token = mTransitions.startTransition(type, wct, this); + mPendingTransitionTokens.add(token); + } + + @Override + public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction startT, + @NonNull SurfaceControl.Transaction finishT, + @NonNull Transitions.TransitionFinishCallback finishCallback) { + boolean transitionHandled = false; + for (TransitionInfo.Change change : info.getChanges()) { + if ((change.getFlags() & TransitionInfo.FLAG_IS_WALLPAPER) != 0) { + continue; + } + + final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); + if (taskInfo == null || taskInfo.taskId == -1) { + continue; + } + + if (change.getMode() == WindowManager.TRANSIT_CHANGE) { + transitionHandled |= startChangeTransition( + transition, info.getType(), change, startT, finishCallback); + } + } + + mPendingTransitionTokens.remove(transition); + + return transitionHandled; + } + + private boolean startChangeTransition( + @NonNull IBinder transition, + @WindowManager.TransitionType int type, + @NonNull TransitionInfo.Change change, + @NonNull SurfaceControl.Transaction startT, + @NonNull Transitions.TransitionFinishCallback finishCallback) { + if (!mPendingTransitionTokens.contains(transition)) { + return false; + } + + final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); + if (type == Transitions.TRANSIT_ENTER_FREEFORM + && taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) { + // Transitioning to freeform but keeping fullscreen bounds, so the crop is set + // to null and we don't require an animation + final SurfaceControl sc = change.getLeash(); + startT.setWindowCrop(sc, null); + startT.apply(); + mTransitions.getMainExecutor().execute( + () -> finishCallback.onTransitionFinished(null, null)); + return true; + } + + Rect endBounds = change.getEndAbsBounds(); + if (type == Transitions.TRANSIT_ENTER_DESKTOP_MODE + && taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM + && !endBounds.isEmpty()) { + // This Transition animates a task to freeform bounds after being dragged into freeform + // mode and brings the remaining freeform tasks to front + final SurfaceControl sc = change.getLeash(); + startT.setWindowCrop(sc, endBounds.width(), + endBounds.height()); + startT.apply(); + + // We want to find the scale of the current bounds relative to the end bounds. The + // task is currently scaled to DRAG_FREEFORM_SCALE and the final bounds will be + // scaled to FINAL_FREEFORM_SCALE. So, it is scaled to + // DRAG_FREEFORM_SCALE / FINAL_FREEFORM_SCALE relative to the freeform bounds + final ValueAnimator animator = + ValueAnimator.ofFloat(DRAG_FREEFORM_SCALE / FINAL_FREEFORM_SCALE, 1f); + animator.setDuration(FREEFORM_ANIMATION_DURATION); + final SurfaceControl.Transaction t = mTransactionSupplier.get(); + animator.addUpdateListener(animation -> { + final float animationValue = (float) animation.getAnimatedValue(); + t.setScale(sc, animationValue, animationValue); + + final float animationWidth = endBounds.width() * animationValue; + final float animationHeight = endBounds.height() * animationValue; + final int animationX = endBounds.centerX() - (int) (animationWidth / 2); + final int animationY = endBounds.centerY() - (int) (animationHeight / 2); + + t.setPosition(sc, animationX, animationY); + t.apply(); + }); + + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mTransitions.getMainExecutor().execute( + () -> finishCallback.onTransitionFinished(null, null)); + } + }); + + animator.start(); + return true; + } + + return false; + } + + @Nullable + @Override + public WindowContainerTransaction handleRequest(@NonNull IBinder transition, + @NonNull TransitionRequestInfo request) { + return null; + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java index 60e5ff27cab9..e1a56a1a5a7a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java @@ -112,6 +112,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs onChangeTransitionReady(change, startT, finishT); break; } + mWindowDecorViewModel.onTransitionReady(transition, info, change); } mTransitionToTaskInfo.put(transition, taskInfoList); } @@ -168,6 +169,8 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs } else { mTransitionToTaskInfo.put(playing, infoOfMerged); } + + mWindowDecorViewModel.onTransitionMerged(merged, playing); } @Override @@ -175,7 +178,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs final List<ActivityManager.RunningTaskInfo> taskInfo = mTransitionToTaskInfo.getOrDefault(transition, Collections.emptyList()); mTransitionToTaskInfo.remove(transition); - + mWindowDecorViewModel.onTransitionFinished(transition); for (int i = 0; i < taskInfo.size(); ++i) { mWindowDecorViewModel.destroyWindowDecoration(taskInfo.get(i)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java index 1187126f5bf1..4c53f607a5f8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java @@ -210,7 +210,7 @@ public class PipAnimationController { /** * Quietly cancel the animator by removing the listeners first. */ - public static void quietCancel(@NonNull ValueAnimator animator) { + static void quietCancel(@NonNull ValueAnimator animator) { animator.removeAllUpdateListeners(); animator.removeAllListeners(); animator.cancel(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index c19d54365309..c5fc879039cb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -145,10 +145,12 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, // These callbacks are called on the update thread private final PipAnimationController.PipAnimationCallback mPipAnimationCallback = new PipAnimationController.PipAnimationCallback() { + private boolean mIsCancelled; @Override public void onPipAnimationStart(TaskInfo taskInfo, PipAnimationController.PipTransitionAnimator animator) { final int direction = animator.getTransitionDirection(); + mIsCancelled = false; sendOnPipTransitionStarted(direction); } @@ -156,6 +158,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, public void onPipAnimationEnd(TaskInfo taskInfo, SurfaceControl.Transaction tx, PipAnimationController.PipTransitionAnimator animator) { final int direction = animator.getTransitionDirection(); + if (mIsCancelled) { + sendOnPipTransitionFinished(direction); + return; + } final int animationType = animator.getAnimationType(); final Rect destinationBounds = animator.getDestinationBounds(); if (isInPipDirection(direction) && animator.getContentOverlayLeash() != null) { @@ -194,6 +200,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, public void onPipAnimationCancel(TaskInfo taskInfo, PipAnimationController.PipTransitionAnimator animator) { final int direction = animator.getTransitionDirection(); + mIsCancelled = true; if (isInPipDirection(direction) && animator.getContentOverlayLeash() != null) { fadeOutAndRemoveOverlay(animator.getContentOverlayLeash(), animator::clearContentOverlay, true /* withStartDelay */); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index 582616d99954..463ad77d828f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -783,7 +783,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb mPipAnimationController.getCurrentAnimator(); if (animator != null && animator.isRunning()) { // cancel any running animator, as it is using stale display layout information - PipAnimationController.quietCancel(animator); + animator.cancel(); } onDisplayChangedUncheck(layout, saveRestoreSnapFraction); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index e09c3c9e4d3f..ebdaaa9aa4a9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -296,6 +296,11 @@ class SplitScreenTransitions { Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { + if (mPendingEnter != null) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + + " skip to start enter split transition since it already exist. "); + return null; + } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); return transition; @@ -323,6 +328,12 @@ class SplitScreenTransitions { IBinder startDismissTransition(WindowContainerTransaction wct, Transitions.TransitionHandler handler, @SplitScreen.StageType int dismissTop, @SplitScreenController.ExitReason int reason) { + if (mPendingDismiss != null) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + + " skip to start dismiss split transition since it already exist. reason to " + + " dismiss = %s", exitReasonToString(reason)); + return null; + } final int type = reason == EXIT_REASON_DRAG_DIVIDER ? TRANSIT_SPLIT_DISMISS_SNAP : TRANSIT_SPLIT_DISMISS; IBinder transition = mTransitions.startTransition(type, wct, handler); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index b8b6d5b96a93..beabf1842f8d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -19,6 +19,7 @@ package com.android.wm.shell.transition; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_SLEEP; @@ -133,6 +134,12 @@ public class Transitions implements RemoteCallable<Transitions> { /** Transition type for maximize to freeform transition. */ public static final int TRANSIT_RESTORE_FROM_MAXIMIZE = WindowManager.TRANSIT_FIRST_CUSTOM + 9; + /** Transition type to freeform in desktop mode. */ + public static final int TRANSIT_ENTER_FREEFORM = WindowManager.TRANSIT_FIRST_CUSTOM + 10; + + /** Transition type to freeform in desktop mode. */ + public static final int TRANSIT_ENTER_DESKTOP_MODE = WindowManager.TRANSIT_FIRST_CUSTOM + 11; + private final WindowOrganizer mOrganizer; private final Context mContext; private final ShellExecutor mMainExecutor; @@ -541,9 +548,7 @@ public class Transitions implements RemoteCallable<Transitions> { } } - // Allow to notify keyguard un-occluding state to KeyguardService, which can happen while - // screen-off, so there might no visibility change involved. - if (info.getRootCount() == 0 && info.getType() != TRANSIT_KEYGUARD_UNOCCLUDE) { + if (info.getRootCount() == 0 && !alwaysReportToKeyguard(info)) { // No root-leashes implies that the transition is empty/no-op, so just do // housekeeping and return. ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "No transition roots (%s): %s", @@ -589,6 +594,23 @@ public class Transitions implements RemoteCallable<Transitions> { processReadyQueue(); } + /** + * Some transitions we always need to report to keyguard even if they are empty. + * TODO (b/274954192): Remove this once keyguard dispatching moves to Shell. + */ + private static boolean alwaysReportToKeyguard(TransitionInfo info) { + // occlusion status of activities can change while screen is off so there will be no + // visibility change but we still need keyguardservice to be notified. + if (info.getType() == TRANSIT_KEYGUARD_UNOCCLUDE) return true; + + // It's possible for some activities to stop with bad timing (esp. since we can't yet + // queue activity transitions initiated by apps) that results in an empty transition for + // keyguard going-away. In general, we should should always report Keyguard-going-away. + if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) return true; + + return false; + } + void processReadyQueue() { if (mReadyTransitions.isEmpty()) { // Check if idle. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java index 6b7ca421f5ed..8e8facadfd5d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java @@ -23,11 +23,13 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.os.Handler; +import android.os.IBinder; import android.util.SparseArray; import android.view.Choreographer; import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.View; +import android.window.TransitionInfo; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; @@ -72,6 +74,16 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { } @Override + public void onTransitionReady(IBinder transition, TransitionInfo info, + TransitionInfo.Change change) {} + + @Override + public void onTransitionMerged(IBinder merged, IBinder playing) {} + + @Override + public void onTransitionFinished(IBinder transition) {} + + @Override public void setFreeformTaskTransitionStarter(FreeformTaskTransitionStarter transitionStarter) { mTaskOperations = new TaskOperations(transitionStarter, mContext, mSyncQueue); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 317b9a322fbc..f943e52e59a2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -22,7 +22,11 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; +import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.DRAG_FREEFORM_SCALE; +import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FINAL_FREEFORM_SCALE; +import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FREEFORM_ANIMATION_DURATION; +import android.animation.ValueAnimator; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityTaskManager; @@ -30,6 +34,7 @@ import android.content.Context; import android.graphics.Rect; import android.hardware.input.InputManager; import android.os.Handler; +import android.os.IBinder; import android.os.Looper; import android.util.SparseArray; import android.view.Choreographer; @@ -39,9 +44,13 @@ import android.view.InputEventReceiver; import android.view.InputMonitor; import android.view.MotionEvent; import android.view.SurfaceControl; +import android.view.SurfaceControl.Transaction; import android.view.View; +import android.view.WindowManager; +import android.window.TransitionInfo; import android.window.WindowContainerToken; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; @@ -54,8 +63,10 @@ import com.android.wm.shell.desktopmode.DesktopModeStatus; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; import com.android.wm.shell.splitscreen.SplitScreenController; +import com.android.wm.shell.transition.Transitions; import java.util.Optional; +import java.util.function.Supplier; /** * View model for the window decoration with a caption and shadows. Works with @@ -83,9 +94,20 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final DragStartListenerImpl mDragStartListener = new DragStartListenerImpl(); private final InputMonitorFactory mInputMonitorFactory; private TaskOperations mTaskOperations; + private final Supplier<SurfaceControl.Transaction> mTransactionFactory; private Optional<SplitScreenController> mSplitScreenController; + private ValueAnimator mDragToDesktopValueAnimator; + private final Rect mDragToDesktopAnimationStartBounds = new Rect(); + private boolean mDragToDesktopAnimationStarted; + private float mCaptionDragStartX; + + // These values keep track of any transitions to freeform to stop relayout from running on + // changing task so that shellTransitions has a chance to animate the transition + private int mPauseRelayoutForTask = -1; + private IBinder mTransitionPausingRelayout; + public DesktopModeWindowDecorViewModel( Context context, Handler mainHandler, @@ -107,7 +129,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { desktopTasksController, splitScreenController, new DesktopModeWindowDecoration.Factory(), - new InputMonitorFactory()); + new InputMonitorFactory(), + SurfaceControl.Transaction::new); } @VisibleForTesting @@ -122,7 +145,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController, DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory, - InputMonitorFactory inputMonitorFactory) { + InputMonitorFactory inputMonitorFactory, + Supplier<SurfaceControl.Transaction> transactionFactory) { mContext = context; mMainHandler = mainHandler; mMainChoreographer = mainChoreographer; @@ -136,6 +160,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mDesktopModeWindowDecorFactory = desktopModeWindowDecorFactory; mInputMonitorFactory = inputMonitorFactory; + mTransactionFactory = transactionFactory; } @Override @@ -155,6 +180,31 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } @Override + public void onTransitionReady( + @NonNull IBinder transition, + @NonNull TransitionInfo info, + @NonNull TransitionInfo.Change change) { + if (change.getMode() == WindowManager.TRANSIT_CHANGE + && info.getType() == Transitions.TRANSIT_ENTER_DESKTOP_MODE) { + mTransitionPausingRelayout = transition; + } + } + + @Override + public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { + if (mTransitionPausingRelayout.equals(merged)) { + mTransitionPausingRelayout = playing; + } + } + + @Override + public void onTransitionFinished(@NonNull IBinder transition) { + if (transition.equals(mTransitionPausingRelayout)) { + mPauseRelayoutForTask = -1; + } + } + + @Override public void onTaskInfoChanged(RunningTaskInfo taskInfo) { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskInfo.taskId); if (decoration == null) return; @@ -165,7 +215,12 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { incrementEventReceiverTasks(taskInfo.displayId); } - decoration.relayout(taskInfo); + // TaskListener callbacks and shell transitions aren't synchronized, so starting a shell + // transition can trigger an onTaskInfoChanged call that updates the task's SurfaceControl + // and interferes with the transition animation that is playing at the same time. + if (taskInfo.taskId != mPauseRelayoutForTask) { + decoration.relayout(taskInfo); + } } @Override @@ -252,6 +307,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } else if (id == R.id.back_button) { mTaskOperations.injectBackKey(); } else if (id == R.id.caption_handle || id == R.id.open_menu_button) { + moveTaskToFront(mTaskOrganizer.getRunningTaskInfo(mTaskId)); decoration.createHandleMenu(); } else if (id == R.id.desktop_button) { mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(true)); @@ -272,9 +328,17 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { if (id != R.id.caption_handle && id != R.id.desktop_mode_caption) { return false; } + moveTaskToFront(mTaskOrganizer.getRunningTaskInfo(mTaskId)); return mDragDetector.onMotionEvent(e); } + private void moveTaskToFront(RunningTaskInfo taskInfo) { + if (!taskInfo.isFocused) { + mDesktopTasksController.ifPresent(c -> c.moveTaskToFront(taskInfo)); + mDesktopModeController.ifPresent(c -> c.moveTaskToFront(taskInfo)); + } + } + /** * @param e {@link MotionEvent} to process * @return {@code true} if the motion event is handled. @@ -295,7 +359,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { case MotionEvent.ACTION_DOWN: { mDragPointerId = e.getPointerId(0); mDragPositioningCallback.onDragPositioningStart( - 0 /* ctrlType */, e.getRawX(0), e.getRawY(0)); + 0 /* ctrlType */, e.getRawX(0), + e.getRawY(0)); mIsDragging = false; return false; } @@ -403,7 +468,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { final DesktopModeWindowDecoration relevantDecor = getRelevantWindowDecor(ev); if (DesktopModeStatus.isProto2Enabled()) { if (relevantDecor == null - || relevantDecor.mTaskInfo.getWindowingMode() != WINDOWING_MODE_FREEFORM) { + || relevantDecor.mTaskInfo.getWindowingMode() != WINDOWING_MODE_FREEFORM + || mTransitionDragActive) { handleCaptionThroughStatusBar(ev, relevantDecor); } } @@ -444,8 +510,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { DesktopModeWindowDecoration relevantDecor) { switch (ev.getActionMasked()) { case MotionEvent.ACTION_DOWN: { + mCaptionDragStartX = ev.getX(); // Begin drag through status bar if applicable. if (relevantDecor != null) { + mDragToDesktopAnimationStartBounds.set( + relevantDecor.mTaskInfo.configuration.windowConfiguration.getBounds()); boolean dragFromStatusBarAllowed = false; if (DesktopModeStatus.isProto2Enabled()) { // In proto2 any full screen task can be dragged to freeform @@ -461,33 +530,105 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } case MotionEvent.ACTION_UP: { if (relevantDecor == null) { + mDragToDesktopAnimationStarted = false; mTransitionDragActive = false; return; } if (mTransitionDragActive) { mTransitionDragActive = false; - final int statusBarHeight = mDisplayController - .getDisplayLayout(relevantDecor.mTaskInfo.displayId).stableInsets().top; + final int statusBarHeight = getStatusBarHeight( + relevantDecor.mTaskInfo.displayId); if (ev.getY() > statusBarHeight) { if (DesktopModeStatus.isProto2Enabled()) { + mPauseRelayoutForTask = relevantDecor.mTaskInfo.taskId; mDesktopTasksController.ifPresent( - c -> c.moveToDesktop(relevantDecor.mTaskInfo)); + c -> c.moveToDesktopWithAnimation(relevantDecor.mTaskInfo, + getFreeformBounds(ev))); } else if (DesktopModeStatus.isProto1Enabled()) { mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(true)); } - + mDragToDesktopAnimationStarted = false; + return; + } else if (mDragToDesktopAnimationStarted) { + mDesktopTasksController.ifPresent(c -> + c.moveToFullscreen(relevantDecor.mTaskInfo)); + mDragToDesktopAnimationStarted = false; return; } } relevantDecor.checkClickEvent(ev); break; } + + case MotionEvent.ACTION_MOVE: { + if (relevantDecor == null) { + return; + } + if (mTransitionDragActive) { + final int statusBarHeight = mDisplayController + .getDisplayLayout( + relevantDecor.mTaskInfo.displayId).stableInsets().top; + if (ev.getY() > statusBarHeight) { + if (!mDragToDesktopAnimationStarted) { + mDragToDesktopAnimationStarted = true; + mDesktopTasksController.ifPresent( + c -> c.moveToFreeform(relevantDecor.mTaskInfo, + mDragToDesktopAnimationStartBounds)); + startAnimation(relevantDecor); + } + } + if (mDragToDesktopAnimationStarted) { + Transaction t = mTransactionFactory.get(); + float width = (float) mDragToDesktopValueAnimator.getAnimatedValue() + * mDragToDesktopAnimationStartBounds.width(); + float x = ev.getX() - (width / 2); + t.setPosition(relevantDecor.mTaskSurface, x, ev.getY()); + t.apply(); + } + } + break; + } + case MotionEvent.ACTION_CANCEL: { mTransitionDragActive = false; + mDragToDesktopAnimationStarted = false; } } } + private Rect getFreeformBounds(@NonNull MotionEvent ev) { + final Rect endBounds = new Rect(); + final int finalWidth = (int) (FINAL_FREEFORM_SCALE + * mDragToDesktopAnimationStartBounds.width()); + final int finalHeight = (int) (FINAL_FREEFORM_SCALE + * mDragToDesktopAnimationStartBounds.height()); + + endBounds.left = mDragToDesktopAnimationStartBounds.centerX() - finalWidth / 2 + + (int) (ev.getX() - mCaptionDragStartX); + endBounds.right = endBounds.left + (int) (FINAL_FREEFORM_SCALE + * mDragToDesktopAnimationStartBounds.width()); + endBounds.top = (int) (ev.getY() + - ((FINAL_FREEFORM_SCALE - DRAG_FREEFORM_SCALE) + * mDragToDesktopAnimationStartBounds.height() / 2)); + endBounds.bottom = endBounds.top + finalHeight; + + return endBounds; + } + + private void startAnimation(@NonNull DesktopModeWindowDecoration focusedDecor) { + mDragToDesktopValueAnimator = ValueAnimator.ofFloat(1f, DRAG_FREEFORM_SCALE); + mDragToDesktopValueAnimator.setDuration(FREEFORM_ANIMATION_DURATION); + final Transaction t = mTransactionFactory.get(); + mDragToDesktopValueAnimator.addUpdateListener(animation -> { + final float animatorValue = (float) animation.getAnimatedValue(); + SurfaceControl sc = focusedDecor.mTaskSurface; + t.setScale(sc, animatorValue, animatorValue); + t.apply(); + }); + + mDragToDesktopValueAnimator.start(); + } + @Nullable private DesktopModeWindowDecoration getRelevantWindowDecor(MotionEvent ev) { if (mSplitScreenController.isPresent() @@ -534,6 +675,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { return focusedDecor; } + private int getStatusBarHeight(int displayId) { + return mDisplayController.getDisplayLayout(displayId).stableInsets().top; + } + private void createInputChannel(int displayId) { final InputManager inputManager = mContext.getSystemService(InputManager.class); final InputMonitor inputMonitor = diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecorViewModel.java index 3734487e8f4b..9f03d9aec166 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecorViewModel.java @@ -17,7 +17,9 @@ package com.android.wm.shell.windowdecor; import android.app.ActivityManager; +import android.os.IBinder; import android.view.SurfaceControl; +import android.window.TransitionInfo; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; @@ -95,4 +97,34 @@ public interface WindowDecorViewModel { * @param taskInfo the info of the task */ void destroyWindowDecoration(ActivityManager.RunningTaskInfo taskInfo); + + /** + * Notifies that a shell transition is about to start. If the transition is of type + * TRANSIT_ENTER_DESKTOP, it will save that transition to unpause relayout for the transitioning + * task after the transition has ended. + * + * @param transition the ready transaction + * @param info of Transition to check if relayout needs to be paused for a task + * @param change a change in the given transition + */ + default void onTransitionReady(IBinder transition, TransitionInfo info, + TransitionInfo.Change change) {} + + /** + * Notifies that a shell transition is about to merge with another to give the window + * decoration a chance to prepare for this merge. + * + * @param merged the transaction being merged + * @param playing the transaction being merged into + */ + default void onTransitionMerged(IBinder merged, IBinder playing) {} + + /** + * Notifies that a shell transition is about to finish to give the window decoration a chance + * to clean up. + * + * @param transaction + */ + default void onTransitionFinished(IBinder transaction) {} + }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TransitionInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TransitionInfoBuilder.java index 26b787fa836c..a658375ca38a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TransitionInfoBuilder.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TransitionInfoBuilder.java @@ -38,8 +38,15 @@ public class TransitionInfoBuilder { public TransitionInfoBuilder(@WindowManager.TransitionType int type, @WindowManager.TransitionFlags int flags) { + this(type, flags, false /* asNoOp */); + } + + public TransitionInfoBuilder(@WindowManager.TransitionType int type, + @WindowManager.TransitionFlags int flags, boolean asNoOp) { mInfo = new TransitionInfo(type, flags); - mInfo.addRootLeash(DISPLAY_ID, createMockSurface(true /* valid */), 0, 0); + if (!asNoOp) { + mInfo.addRootLeash(DISPLAY_ID, createMockSurface(true /* valid */), 0, 0); + } } public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java index 47c9e06e8681..12ceb0a9a9ba 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java @@ -31,14 +31,12 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import android.annotation.Nullable; import android.app.ActivityManager; import android.app.TaskInfo; -import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Insets; import android.graphics.Rect; import android.testing.AndroidTestingRunner; +import android.util.Pair; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.SurfaceControlViewHost; @@ -53,6 +51,7 @@ import androidx.test.filters.SmallTest; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; +import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.DockStateReader; import com.android.wm.shell.common.SyncTransactionQueue; @@ -67,6 +66,10 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; + /** * Tests for {@link LetterboxEduWindowManager}. * @@ -80,8 +83,10 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { private static final int USER_ID_1 = 1; private static final int USER_ID_2 = 2; - private static final String PREF_KEY_1 = String.valueOf(USER_ID_1); - private static final String PREF_KEY_2 = String.valueOf(USER_ID_2); + private static final String TEST_COMPAT_UI_SHARED_PREFERENCES = "test_compat_ui_configuration"; + + private static final String TEST_HAS_SEEN_LETTERBOX_SHARED_PREFERENCES = + "test_has_seen_letterbox"; private static final int TASK_ID = 1; @@ -103,46 +108,46 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { @Mock private ShellTaskOrganizer.TaskListener mTaskListener; @Mock private SurfaceControlViewHost mViewHost; @Mock private Transitions mTransitions; - @Mock private Runnable mOnDismissCallback; + @Mock private Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> mOnDismissCallback; @Mock private DockStateReader mDockStateReader; - private SharedPreferences mSharedPreferences; - @Nullable - private Boolean mInitialPrefValue1 = null; - @Nullable - private Boolean mInitialPrefValue2 = null; + private CompatUIConfiguration mCompatUIConfiguration; + private TestShellExecutor mExecutor; @Before public void setUp() { MockitoAnnotations.initMocks(this); - - mSharedPreferences = mContext.getSharedPreferences( - LetterboxEduWindowManager.HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME, - Context.MODE_PRIVATE); - if (mSharedPreferences.contains(PREF_KEY_1)) { - mInitialPrefValue1 = mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false); - mSharedPreferences.edit().remove(PREF_KEY_1).apply(); - } - if (mSharedPreferences.contains(PREF_KEY_2)) { - mInitialPrefValue2 = mSharedPreferences.getBoolean(PREF_KEY_2, /* default= */ false); - mSharedPreferences.edit().remove(PREF_KEY_2).apply(); - } + mExecutor = new TestShellExecutor(); + mCompatUIConfiguration = new CompatUIConfiguration(mContext, mExecutor) { + + final Set<Integer> mHasSeenSet = new HashSet<>(); + + @Override + boolean getHasSeenLetterboxEducation(int userId) { + return mHasSeenSet.contains(userId); + } + + @Override + void setSeenLetterboxEducation(int userId) { + mHasSeenSet.add(userId); + } + + @Override + protected String getCompatUISharedPreferenceName() { + return TEST_COMPAT_UI_SHARED_PREFERENCES; + } + + @Override + protected String getHasSeenLetterboxEducationSharedPreferencedName() { + return TEST_HAS_SEEN_LETTERBOX_SHARED_PREFERENCES; + } + }; } @After public void tearDown() { - SharedPreferences.Editor editor = mSharedPreferences.edit(); - if (mInitialPrefValue1 == null) { - editor.remove(PREF_KEY_1); - } else { - editor.putBoolean(PREF_KEY_1, mInitialPrefValue1); - } - if (mInitialPrefValue2 == null) { - editor.remove(PREF_KEY_2); - } else { - editor.putBoolean(PREF_KEY_2, mInitialPrefValue2); - } - editor.apply(); + mContext.deleteSharedPreferences(TEST_COMPAT_UI_SHARED_PREFERENCES); + mContext.deleteSharedPreferences(TEST_HAS_SEEN_LETTERBOX_SHARED_PREFERENCES); } @Test @@ -166,8 +171,8 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { @Test public void testCreateLayout_taskBarEducationIsShowing_doesNotCreateLayout() { - LetterboxEduWindowManager windowManager = createWindowManager(/* eligible= */ - true, USER_ID_1, /* isTaskbarEduShowing= */ true); + LetterboxEduWindowManager windowManager = createWindowManager(/* eligible= */ true, + USER_ID_1, /* isTaskbarEduShowing= */ true); assertFalse(windowManager.createLayout(/* canShow= */ true)); @@ -180,7 +185,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { assertTrue(windowManager.createLayout(/* canShow= */ false)); - assertFalse(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + assertFalse(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); assertNull(windowManager.mLayout); } @@ -201,7 +206,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { spyOn(dialogTitle); // The education shouldn't be marked as seen until enter animation is done. - assertFalse(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + assertFalse(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); // Clicking the layout does nothing until enter animation is done. layout.performClick(); verify(mAnimationController, never()).startExitAnimation(any(), any()); @@ -210,7 +215,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { verifyAndFinishEnterAnimation(layout); - assertTrue(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + assertFalse(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); verify(dialogTitle).sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); // Exit animation should start following a click on the layout. layout.performClick(); @@ -218,13 +223,16 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { // Window manager isn't released until exit animation is done. verify(windowManager, never()).release(); + // After dismissed the user has seen the dialog + assertTrue(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); + // Verify multiple clicks are ignored. layout.performClick(); verifyAndFinishExitAnimation(layout); verify(windowManager).release(); - verify(mOnDismissCallback).run(); + verify(mOnDismissCallback).accept(any()); } @Test @@ -236,7 +244,10 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { assertNotNull(windowManager.mLayout); verifyAndFinishEnterAnimation(windowManager.mLayout); - assertTrue(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + + // We dismiss + windowManager.mLayout.findViewById(R.id.letterbox_education_dialog_dismiss_button) + .performClick(); windowManager.release(); windowManager = createWindowManager(/* eligible= */ true, @@ -254,7 +265,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { assertNotNull(windowManager.mLayout); verifyAndFinishEnterAnimation(windowManager.mLayout); - assertTrue(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + assertTrue(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); } @Test @@ -271,7 +282,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { mRunOnIdleCaptor.getValue().run(); verify(mAnimationController, never()).startEnterAnimation(any(), any()); - assertFalse(mSharedPreferences.getBoolean(PREF_KEY_1, /* default= */ false)); + assertFalse(mCompatUIConfiguration.getHasSeenLetterboxEducation(USER_ID_1)); } @Test @@ -297,7 +308,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { mTaskListener, /* canShow= */ true)); verify(windowManager).release(); - verify(mOnDismissCallback, never()).run(); + verify(mOnDismissCallback, never()).accept(any()); verify(mAnimationController, never()).startExitAnimation(any(), any()); assertNull(windowManager.mLayout); } @@ -395,8 +406,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { } private LetterboxEduWindowManager createWindowManager(boolean eligible, boolean isDocked) { - return createWindowManager(eligible, USER_ID_1, /* isTaskbarEduShowing= */ - false, isDocked); + return createWindowManager(eligible, USER_ID_1, /* isTaskbarEduShowing= */ false, isDocked); } private LetterboxEduWindowManager createWindowManager(boolean eligible, int userId, @@ -410,9 +420,8 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { LetterboxEduWindowManager windowManager = new LetterboxEduWindowManager(mContext, createTaskInfo(eligible, userId), mSyncTransactionQueue, mTaskListener, - createDisplayLayout(), mTransitions, mOnDismissCallback, - mAnimationController, mDockStateReader); - + createDisplayLayout(), mTransitions, mOnDismissCallback, mAnimationController, + mDockStateReader, mCompatUIConfiguration); spyOn(windowManager); doReturn(mViewHost).when(windowManager).createSurfaceViewHost(); doReturn(isTaskbarEduShowing).when(windowManager).isTaskbarEduShowing(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java new file mode 100644 index 000000000000..0be08ba74d86 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.compatui; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; + +import android.testing.AndroidTestingRunner; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.test.filters.SmallTest; + +import com.android.wm.shell.R; +import com.android.wm.shell.ShellTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; + +/** + * Tests for {@link LetterboxEduDialogLayout}. + * + * Build/Install/Run: + * atest WMShellUnitTests:ReachabilityEduLayoutTest + */ +@RunWith(AndroidTestingRunner.class) +@SmallTest +public class ReachabilityEduLayoutTest extends ShellTestCase { + + private ReachabilityEduLayout mLayout; + private View mMoveUpButton; + private View mMoveDownButton; + private View mMoveLeftButton; + private View mMoveRightButton; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mLayout = (ReachabilityEduLayout) LayoutInflater.from(mContext) + .inflate(R.layout.reachability_ui_layout, null); + mMoveLeftButton = mLayout.findViewById(R.id.reachability_move_left_button); + mMoveRightButton = mLayout.findViewById(R.id.reachability_move_right_button); + mMoveUpButton = mLayout.findViewById(R.id.reachability_move_up_button); + mMoveDownButton = mLayout.findViewById(R.id.reachability_move_down_button); + } + + @Test + public void testOnFinishInflate() { + assertNotNull(mMoveUpButton); + assertNotNull(mMoveDownButton); + assertNotNull(mMoveLeftButton); + assertNotNull(mMoveRightButton); + } + + @Test + public void handleVisibility_activityNotLetterboxed_buttonsAreHidden() { + mLayout.handleVisibility(/* isActivityLetterboxed */ false, + /* letterboxVerticalPosition */ -1, /* letterboxHorizontalPosition */ -1, + /* availableWidth */ 0, /* availableHeight */ 0, /* fromDoubleTap */ false); + assertEquals(View.INVISIBLE, mMoveUpButton.getVisibility()); + assertEquals(View.INVISIBLE, mMoveDownButton.getVisibility()); + assertEquals(View.INVISIBLE, mMoveLeftButton.getVisibility()); + assertEquals(View.INVISIBLE, mMoveRightButton.getVisibility()); + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java new file mode 100644 index 000000000000..359ef979a310 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.compatui; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + +import android.app.ActivityManager; +import android.app.TaskInfo; +import android.testing.AndroidTestingRunner; + +import androidx.test.filters.SmallTest; + +import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.ShellTestCase; +import com.android.wm.shell.TestShellExecutor; +import com.android.wm.shell.common.DisplayLayout; +import com.android.wm.shell.common.SyncTransactionQueue; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * Tests for {@link ReachabilityEduWindowManager}. + * + * Build/Install/Run: + * atest WMShellUnitTests:ReachabilityEduWindowManagerTest + */ +@RunWith(AndroidTestingRunner.class) +@SmallTest +public class ReachabilityEduWindowManagerTest extends ShellTestCase { + + private static final int USER_ID = 1; + private static final int TASK_ID = 1; + + @Mock + private SyncTransactionQueue mSyncTransactionQueue; + @Mock + private ShellTaskOrganizer.TaskListener mTaskListener; + @Mock + private CompatUIController.CompatUICallback mCallback; + @Mock + private CompatUIConfiguration mCompatUIConfiguration; + @Mock + private DisplayLayout mDisplayLayout; + + private TestShellExecutor mExecutor; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mExecutor = new TestShellExecutor(); + } + + @Test + public void testCreateLayout_notEligible_doesNotCreateLayout() { + final ReachabilityEduWindowManager windowManager = createReachabilityEduWindowManager( + createTaskInfo(/* userId= */ USER_ID, /*isLetterboxDoubleTapEnabled */ false)); + + assertFalse(windowManager.createLayout(/* canShow= */ true)); + + assertNull(windowManager.mLayout); + } + + private ReachabilityEduWindowManager createReachabilityEduWindowManager(TaskInfo taskInfo) { + return new ReachabilityEduWindowManager(mContext, taskInfo, + mSyncTransactionQueue, mCallback, mTaskListener, mDisplayLayout, + mCompatUIConfiguration, mExecutor); + } + + private static TaskInfo createTaskInfo(int userId, boolean isLetterboxDoubleTapEnabled) { + return createTaskInfo(userId, /* isLetterboxDoubleTapEnabled */ isLetterboxDoubleTapEnabled, + /* topActivityLetterboxVerticalPosition */ -1, + /* topActivityLetterboxHorizontalPosition */ -1, + /* topActivityLetterboxWidth */ -1, + /* topActivityLetterboxHeight */ -1); + } + + private static TaskInfo createTaskInfo(int userId, boolean isLetterboxDoubleTapEnabled, + int topActivityLetterboxVerticalPosition, int topActivityLetterboxHorizontalPosition, + int topActivityLetterboxWidth, int topActivityLetterboxHeight) { + ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); + taskInfo.userId = userId; + taskInfo.taskId = TASK_ID; + taskInfo.isLetterboxDoubleTapEnabled = isLetterboxDoubleTapEnabled; + taskInfo.topActivityLetterboxVerticalPosition = topActivityLetterboxVerticalPosition; + taskInfo.topActivityLetterboxHorizontalPosition = topActivityLetterboxHorizontalPosition; + taskInfo.topActivityLetterboxWidth = topActivityLetterboxWidth; + taskInfo.topActivityLetterboxHeight = topActivityLetterboxHeight; + return taskInfo; + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 5cad50da7e42..4ccc4678ac5e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -81,6 +81,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock lateinit var syncQueue: SyncTransactionQueue @Mock lateinit var rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer @Mock lateinit var transitions: Transitions + @Mock lateinit var transitionHandler: EnterDesktopTaskTransitionHandler lateinit var mockitoSession: StaticMockitoSession lateinit var controller: DesktopTasksController @@ -116,6 +117,7 @@ class DesktopTasksControllerTest : ShellTestCase() { syncQueue, rootTaskDisplayAreaOrganizer, transitions, + transitionHandler, desktopModeTaskRepository, TestShellExecutor() ) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandlerTest.java new file mode 100644 index 000000000000..6199e0b05059 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandlerTest.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.desktopmode; + +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; + +import static androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import android.annotation.NonNull; +import android.app.ActivityManager; +import android.app.WindowConfiguration; +import android.graphics.Rect; +import android.os.IBinder; +import android.view.SurfaceControl; +import android.view.WindowManager; +import android.window.IWindowContainerToken; +import android.window.TransitionInfo; +import android.window.WindowContainerToken; +import android.window.WindowContainerTransaction; + +import androidx.test.filters.SmallTest; + +import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.transition.Transitions; + +import junit.framework.AssertionFailedError; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.function.Supplier; + +/** Tests of {@link com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler} */ +@SmallTest +public class EnterDesktopTaskTransitionHandlerTest { + + @Mock + private Transitions mTransitions; + @Mock + IBinder mToken; + @Mock + Supplier<SurfaceControl.Transaction> mTransactionFactory; + @Mock + SurfaceControl.Transaction mStartT; + @Mock + SurfaceControl.Transaction mFinishT; + @Mock + SurfaceControl.Transaction mAnimationT; + @Mock + Transitions.TransitionFinishCallback mTransitionFinishCallback; + @Mock + ShellExecutor mExecutor; + @Mock + SurfaceControl mSurfaceControl; + + private EnterDesktopTaskTransitionHandler mEnterDesktopTaskTransitionHandler; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + doReturn(mExecutor).when(mTransitions).getMainExecutor(); + doReturn(mAnimationT).when(mTransactionFactory).get(); + + mEnterDesktopTaskTransitionHandler = new EnterDesktopTaskTransitionHandler(mTransitions, + mTransactionFactory); + } + + @Test + public void testEnterFreeformAnimation() { + final int transitionType = Transitions.TRANSIT_ENTER_FREEFORM; + final int taskId = 1; + WindowContainerTransaction wct = new WindowContainerTransaction(); + doReturn(mToken).when(mTransitions) + .startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler); + mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct); + + TransitionInfo.Change change = + createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM); + TransitionInfo info = createTransitionInfo(Transitions.TRANSIT_ENTER_FREEFORM, change); + + + assertTrue(mEnterDesktopTaskTransitionHandler + .startAnimation(mToken, info, mStartT, mFinishT, mTransitionFinishCallback)); + + verify(mStartT).setWindowCrop(mSurfaceControl, null); + verify(mStartT).apply(); + } + + @Test + public void testTransitEnterDesktopModeAnimation() throws Throwable { + final int transitionType = Transitions.TRANSIT_ENTER_DESKTOP_MODE; + final int taskId = 1; + WindowContainerTransaction wct = new WindowContainerTransaction(); + doReturn(mToken).when(mTransitions) + .startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler); + mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct); + + TransitionInfo.Change change = + createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM); + change.setEndAbsBounds(new Rect(0, 0, 1, 1)); + TransitionInfo info = createTransitionInfo(Transitions.TRANSIT_ENTER_DESKTOP_MODE, change); + + runOnUiThread(() -> { + try { + assertTrue(mEnterDesktopTaskTransitionHandler + .startAnimation(mToken, info, mStartT, mFinishT, + mTransitionFinishCallback)); + } catch (Exception e) { + throw new AssertionFailedError(e.getMessage()); + } + }); + + verify(mStartT).setWindowCrop(mSurfaceControl, change.getEndAbsBounds().width(), + change.getEndAbsBounds().height()); + verify(mStartT).apply(); + } + + private TransitionInfo.Change createChange(@WindowManager.TransitionType int type, int taskId, + @WindowConfiguration.WindowingMode int windowingMode) { + final ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); + taskInfo.taskId = taskId; + taskInfo.configuration.windowConfiguration.setWindowingMode(windowingMode); + final TransitionInfo.Change change = new TransitionInfo.Change( + new WindowContainerToken(mock(IWindowContainerToken.class)), mSurfaceControl); + change.setMode(type); + change.setTaskInfo(taskInfo); + return change; + } + + private static TransitionInfo createTransitionInfo( + @WindowManager.TransitionType int type, @NonNull TransitionInfo.Change change) { + TransitionInfo info = new TransitionInfo(type, 0); + info.addChange(change); + return info; + } + +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index 44f1f0147b52..60d697823f64 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -1039,6 +1039,25 @@ public class ShellTransitionTests extends ShellTestCase { verify(observer, times(0)).onTransitionFinished(eq(transitToken3), anyBoolean()); } + @Test + public void testEmptyTransitionStillReportsKeyguardGoingAway() { + Transitions transitions = createTestTransitions(); + transitions.replaceDefaultHandlerForTest(mDefaultHandler); + + IBinder transitToken = new Binder(); + transitions.requestStartTransition(transitToken, + new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */)); + + // Make a no-op transition + TransitionInfo info = new TransitionInfoBuilder( + TRANSIT_OPEN, TRANSIT_FLAG_KEYGUARD_GOING_AWAY, true /* noOp */).build(); + transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class), + mock(SurfaceControl.Transaction.class)); + + // If keyguard-going-away flag set, then it shouldn't be aborted. + assertEquals(1, mDefaultHandler.activeCount()); + } + class ChangeBuilder { final TransitionInfo.Change mChange; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java index 1d1aa795173c..9a90996b786c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; +import android.app.WindowConfiguration; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.hardware.input.InputManager; @@ -60,6 +61,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; /** Tests of {@link DesktopModeWindowDecorViewModel} */ @SmallTest @@ -80,8 +82,9 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { @Mock private DesktopTasksController mDesktopTasksController; @Mock private InputMonitor mInputMonitor; @Mock private InputManager mInputManager; - @Mock private DesktopModeWindowDecorViewModel.InputMonitorFactory mMockInputMonitorFactory; + @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory; + @Mock private SurfaceControl.Transaction mTransaction; private final List<InputManager> mMockInputManagers = new ArrayList<>(); private DesktopModeWindowDecorViewModel mDesktopModeWindowDecorViewModel; @@ -102,12 +105,14 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { Optional.of(mDesktopTasksController), Optional.of(mSplitScreenController), mDesktopModeWindowDecorFactory, - mMockInputMonitorFactory + mMockInputMonitorFactory, + mTransactionFactory ); doReturn(mDesktopModeWindowDecoration) .when(mDesktopModeWindowDecorFactory) .create(any(), any(), any(), any(), any(), any(), any(), any()); + doReturn(mTransaction).when(mTransactionFactory).get(); when(mMockInputMonitorFactory.create(any(), any())).thenReturn(mInputMonitor); // InputChannel cannot be mocked because it passes to InputEventReceiver. @@ -250,7 +255,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { } private static ActivityManager.RunningTaskInfo createTaskInfo(int taskId, - int displayId, int windowingMode) { + int displayId, @WindowConfiguration.WindowingMode int windowingMode) { ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder() .setDisplayId(displayId) diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index 9df6822b4867..7af6efb7da41 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -104,7 +104,7 @@ bool Properties::load() { debugOverdraw = false; std::string debugOverdrawProperty = base::GetProperty(PROPERTY_DEBUG_OVERDRAW, ""); if (debugOverdrawProperty != "") { - INIT_LOGD(" Overdraw debug enabled: %s", debugOverdrawProperty); + INIT_LOGD(" Overdraw debug enabled: %s", debugOverdrawProperty.c_str()); if (debugOverdrawProperty == "show") { debugOverdraw = true; overdrawColorSet = OverdrawColorSet::Default; diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp index db7639029187..ac1f92dee507 100644 --- a/libs/hwui/jni/android_graphics_RenderNode.cpp +++ b/libs/hwui/jni/android_graphics_RenderNode.cpp @@ -605,15 +605,25 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, } mPreviousPosition = bounds; + ATRACE_NAME("Update SurfaceView position"); + #ifdef __ANDROID__ // Layoutlib does not support CanvasContext - incStrong(0); - auto functor = std::bind( - std::mem_fn(&PositionListenerTrampoline::doUpdatePositionAsync), this, - (jlong) info.canvasContext.getFrameNumber(), - (jint) bounds.left, (jint) bounds.top, - (jint) bounds.right, (jint) bounds.bottom); - - info.canvasContext.enqueueFrameWork(std::move(functor)); + JNIEnv* env = jnienv(); + // Update the new position synchronously. We cannot defer this to + // a worker pool to process asynchronously because the UI thread + // may be unblocked by the time a worker thread can process this, + // In particular if the app removes a view from the view tree before + // this callback is dispatched, then we lose the position + // information for this frame. + jboolean keepListening = env->CallStaticBooleanMethod( + gPositionListener.clazz, gPositionListener.callPositionChanged, mListener, + static_cast<jlong>(info.canvasContext.getFrameNumber()), + static_cast<jint>(bounds.left), static_cast<jint>(bounds.top), + static_cast<jint>(bounds.right), static_cast<jint>(bounds.bottom)); + if (!keepListening) { + env->DeleteGlobalRef(mListener); + mListener = nullptr; + } #endif } @@ -628,7 +638,14 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, ATRACE_NAME("SurfaceView position lost"); JNIEnv* env = jnienv(); #ifdef __ANDROID__ // Layoutlib does not support CanvasContext - // TODO: Remember why this is synchronous and then make a comment + // Update the lost position synchronously. We cannot defer this to + // a worker pool to process asynchronously because the UI thread + // may be unblocked by the time a worker thread can process this, + // In particular if a view's rendernode is readded to the scene + // before this callback is dispatched, then we report that we lost + // position information on the wrong frame, which can be problematic + // for views like SurfaceView which rely on RenderNode callbacks + // for driving visibility. jboolean keepListening = env->CallStaticBooleanMethod( gPositionListener.clazz, gPositionListener.callPositionLost, mListener, info ? info->canvasContext.getFrameNumber() : 0); @@ -708,23 +725,6 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, } } - void doUpdatePositionAsync(jlong frameNumber, jint left, jint top, - jint right, jint bottom) { - ATRACE_NAME("Update SurfaceView position"); - - JNIEnv* env = jnienv(); - jboolean keepListening = env->CallStaticBooleanMethod( - gPositionListener.clazz, gPositionListener.callPositionChanged, mListener, - frameNumber, left, top, right, bottom); - if (!keepListening) { - env->DeleteGlobalRef(mListener); - mListener = nullptr; - } - - // We need to release ourselves here - decStrong(0); - } - JavaVM* mVm; jobject mListener; uirenderer::Rect mPreviousPosition; diff --git a/media/Android.bp b/media/Android.bp index e8555b046237..f69dd3cc3206 100644 --- a/media/Android.bp +++ b/media/Android.bp @@ -29,10 +29,7 @@ aidl_interface { }, }, srcs: [ - "aidl/android/media/soundtrigger_middleware/ISoundTriggerCallback.aidl", - "aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl", - "aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl", - "aidl/android/media/soundtrigger_middleware/SoundTriggerModuleDescriptor.aidl", + "aidl/android/media/soundtrigger_middleware/*.aidl", ], imports: [ "android.media.audio.common.types-V2", diff --git a/media/aidl/android/media/soundtrigger_middleware/IAcknowledgeEvent.aidl b/media/aidl/android/media/soundtrigger_middleware/IAcknowledgeEvent.aidl new file mode 100644 index 000000000000..237e71a61488 --- /dev/null +++ b/media/aidl/android/media/soundtrigger_middleware/IAcknowledgeEvent.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.soundtrigger_middleware; + +/** + * Opaque callback for acknowledging oneway events. + * Since there is no return channel for oneway events, + * passing this interface in a oneway method allows the service to call + * back to the client to indicate the event was registered. + * This essentially functions like a <code> Future<void> </code> without + * an error channel. + * {@hide} + */ +oneway interface IAcknowledgeEvent { + /** + * Acknowledge that the event has been received. + */ + void eventReceived(); + +} diff --git a/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl b/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl new file mode 100644 index 000000000000..dcf39458b261 --- /dev/null +++ b/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.soundtrigger_middleware; + +import android.media.soundtrigger_middleware.IAcknowledgeEvent; + +/** + * Interface for injecting global events to the fake STHAL. + * {@hide} + */ +oneway interface IInjectGlobalEvent { + + /** + * Request a fake STHAL restart. + * This invalidates the {@link IInjectGlobalEvent}. + */ + void triggerRestart(); + + /** + * Triggers global resource contention into the fake STHAL. Loads/startRecognition + * will fail with RESOURCE_CONTENTION. + * @param isContended - true to enable resource contention. false to disable resource contention + * and resume normal functionality. + * @param callback - Call {@link IAcknowledgeEvent#eventReceived()} on this interface once + * the contention status is successfully set. + */ + void setResourceContention(boolean isContended, IAcknowledgeEvent callback); + +} diff --git a/media/aidl/android/media/soundtrigger_middleware/IInjectModelEvent.aidl b/media/aidl/android/media/soundtrigger_middleware/IInjectModelEvent.aidl new file mode 100644 index 000000000000..7752c17a4417 --- /dev/null +++ b/media/aidl/android/media/soundtrigger_middleware/IInjectModelEvent.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.soundtrigger_middleware; + +/** + * Interface for injecting model events into the fake ST HAL. + * + * {@hide} + */ +oneway interface IInjectModelEvent { + /** + * Trigger a preemptive model unload for the model session associated with + * this object. + * This invalidates the {@link IInjectModelEvent} session. + */ + void triggerUnloadModel(); + +} diff --git a/media/aidl/android/media/soundtrigger_middleware/IInjectRecognitionEvent.aidl b/media/aidl/android/media/soundtrigger_middleware/IInjectRecognitionEvent.aidl new file mode 100644 index 000000000000..f1398c631b12 --- /dev/null +++ b/media/aidl/android/media/soundtrigger_middleware/IInjectRecognitionEvent.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.soundtrigger_middleware; + +import android.media.soundtrigger.PhraseRecognitionExtra; + +/** + * Interface for injecting recognition events into the ST Mock HAL. + * {@hide} + */ +oneway interface IInjectRecognitionEvent { + + /** + * Trigger a recognition event for the recognition session associated with + * this object. + * This invalidates the {@link IInjectRecognitionEvent}. + * @param data the recognition data that the client of this model will receive + * @param phraseExtras extra data only delivered for keyphrase models. + */ + void triggerRecognitionEvent(in byte[] data, + in @nullable PhraseRecognitionExtra[] phraseExtras); + + /** + * Trigger an abort event for the recognition session associated with this object. + * This invalidates the {@link IInjectRecognitionEvent}. + */ + void triggerAbortRecognition(); +} diff --git a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerInjection.aidl b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerInjection.aidl new file mode 100644 index 000000000000..732744b92a18 --- /dev/null +++ b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerInjection.aidl @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.soundtrigger_middleware; + +import android.media.soundtrigger.RecognitionConfig; +import android.media.soundtrigger.SoundModel; +import android.media.soundtrigger.Phrase; + +import android.media.soundtrigger_middleware.IInjectModelEvent; +import android.media.soundtrigger_middleware.IInjectRecognitionEvent; +import android.media.soundtrigger_middleware.IInjectGlobalEvent; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; + +/** + * An injection interface for {@link android.media.soundtrigger_middleware.FakeSoundTriggerHal}. + * To avoid deadlocks, all calls to this interface and the sub-interface it creates are oneway. + * Calls are identified as stale via "Session" parameters. + * The client implements this interface and registers it with + * {@link ISoundTriggerMiddlewareService#attachMockHalInjection(ISoundTriggerInjection)}. + * Then, the client will receive callbacks which observe mock HAL events. + * There are two types of calls. + * 1) Those that provide a new injection sub-interface (contains param .*Injection). + * 2) Those that are sessioned via an injection sub-interface (contains param .*Session). + * The new injection sub-interfaces generated by (1) can be used to trigger HAL events. + * Some calls within (2) will invalidate the session object which they are associated with + * (e.g. {@link soundModelUnloaded}), and will be noted as such. + * Some calls within the injection interface (e.g. {@link IInjectModelEvent#triggerUnloadModel()}) + * will invalidate the session object they are called upon, and will be noted as such. + * @hide + */ +oneway interface ISoundTriggerInjection { + + /** + * Value of {@link android.media.soundtrigger.Properties#supportedModelArch} that + * identifies the HAL as a fake HAL. + */ + const String FAKE_HAL_ARCH = "injection"; + + /** + * Called following attachment via + * {@link ISoundTriggerMiddlewareService#attachMockHalInjection(ISoundTriggerInjection)}. + * Provides the client an injection interface for events which are always (globally) valid. + * @param globalInjection - Interface used to inject global events to the fake HAL. + * Used as a session object for further callbacks associated with the HAL globally. + */ + void registerGlobalEventInjection(IInjectGlobalEvent globalInjection); + + /** + * Called when the HAL has been restarted by the framework. Not called after a + * {@link IInjectGlobalEvent#triggerRestart()}. + * @param globalSession - The interface previously provided by a + * {@link registerGlobalEventInjection} call which this restart is associated with. + * Used to disambiguate stale restart events from a subsequent global session. + */ + void onRestarted(IInjectGlobalEvent globalSession); + + /** + * Called when the HAL has been detached by the framework. + * @param globalSession - The interface previously provided by a + * {@link registerGlobalEventInjection} call which this detach is associated with. + * Used to disambiguate stale detach events from a subsequent global session. + */ + void onFrameworkDetached(IInjectGlobalEvent globalSession); + + /** + * Called when a client is attached to the framework. This event is not actually + * delivered to the HAL, but is useful to understand the framework state. + * @param token - An opaque token representing the framework client session. + * Associated with a subsequent call to {@link onClientDetached(IBinder)}. + * @param globalSession - The global STHAL session this attach is associated with. + */ + void onClientAttached(IBinder token, IInjectGlobalEvent globalSession); + + /** + * Called when a client detaches from the framework. This event is not actually + * delivered to the HAL, but is useful to understand the framework state. + * @param token - The opaque token returned by a previous + * {@link onClientAttached(IBinder, IInjectGlobalEvent} call. + */ + void onClientDetached(IBinder token); + + /** + * Called when a sound model is loaded into the fake STHAL by the framework. + * @param model - The model data for the newly loaded model. + * @param phrases - The phrase data for the newly loaded model, if it is a keyphrase model. + * Null otherwise. + * @param modelInjection - Interface used to inject events associated with the newly loaded + * model into the fake STHAL. + * Used as a session object for further callbacks associated with this newly loaded model. + * @param globalSession - The session object representing the global STHAL instance this load + * is associated with. + */ + void onSoundModelLoaded(in SoundModel model, in @nullable Phrase[] phrases, + IInjectModelEvent modelInjection, IInjectGlobalEvent globalSession); + + /** + * Called when the fake STHAL receives a set parameter call from the framework on a previously + * loaded model. + * @param modelParam - Code of the parameter being set, see + * {@link android.media.soundtrigger.ModelParameter} + * @param value - Value to set the modelParam to + * @param modelSession - Session object of the loaded model the set param call is associated + * with. + */ + + void onParamSet(int modelParam, int value, IInjectModelEvent modelSession); + + + /** + * Called when a previously loaded model in the fake STHAL has recognition started by the + * framework. + * @param audioSessionToken - The audio session token passed by the framework which will be + * contained within a received recognition event. + * @param config - The recognition config passed by the framework for this recognition. + * @param recognitionInjection - A new injection interface which allows the client to + * trigger events associated with this newly started recognition. + * @param modelSession - The session object representing the loaded model that this + * recognition is associated with. + */ + void onRecognitionStarted(int audioSessionToken, in RecognitionConfig config, + IInjectRecognitionEvent recognitionInjection, IInjectModelEvent modelSession); + + /** + * Called when a previously started recognition in the fake STHAL is stopped by the framework. + * Not called following any calls on {@link IInjectRecognitionEvent}. + * @param recognitionSession - The session object received via a previous call to + * {@link recognitionStarted(int, RecognitionConfig, IInjectModelEvent, + * IInjectRecognitionEvent} which has been unloaded. + * This session is invalidated subsequent to this call, and no triggers will be respected. + */ + void onRecognitionStopped(IInjectRecognitionEvent recognitionSession); + + /** + * Called when a previously loaded model in the fake STHAL is unloaded by the framework. + * Not called following {@link IInjectModelEvent#triggerUnloadModel()}. + * @param modelSession - The session object received via a previous call to + * {@link soundModelLoaded(SoundModel, Phrase[], IInjectModelEvent} which has been unloaded. + * This session is invalidated subsequent to this call, and no triggers will be respected. + */ + void onSoundModelUnloaded(IInjectModelEvent modelSession); + + /** + * Called when this injection interface has been preempted by a subsequent call to + * {@link ISoundTriggerMiddleware#attachFakeHal(ISoundTriggerInjection)}. + * No more events will be delivered, and any further injection will be ignored. + */ + void onPreempted(); + +} diff --git a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl index d1126b9006e0..531b3ae0c230 100644 --- a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl +++ b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl @@ -13,11 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.media.soundtrigger_middleware; import android.media.permission.Identity; -import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.ISoundTriggerCallback; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; +import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; /** @@ -86,4 +88,12 @@ interface ISoundTriggerMiddlewareService { in Identity middlemanIdentity, in Identity originatorIdentity, ISoundTriggerCallback callback); + + /** + * Attach an injection interface interface to the ST mock HAL. + * See {@link ISoundTriggerInjection} for injection details. + * If another client attaches, this session will be pre-empted. + */ + void attachFakeHalInjection(ISoundTriggerInjection injection); + } diff --git a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl index 0b46fd4ef5f0..18688ce7d48d 100644 --- a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl +++ b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerModule.aidl @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package android.media.soundtrigger_middleware; import android.media.soundtrigger.ModelParameter; @@ -148,4 +149,4 @@ interface ISoundTriggerModule { * All models must have been unloaded prior to calling this method. */ void detach(); -}
\ No newline at end of file +} diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 8efd180b6c93..b4fbc975e53a 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -6806,7 +6806,9 @@ public class AudioManager { /** * @hide - * Sets the computed sound dose value to {@code csd} + * Sets the computed sound dose value to {@code csd}. A negative value will + * reset all the CSD related timeouts: after a momentary exposure warning and + * before the momentary exposure reaches RS2 (see IEC62368-1 10.6.5) */ @TestApi @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) @@ -6850,7 +6852,7 @@ public class AudioManager { /** * @hide - * Returns whether CSD is enabled on this device. + * Returns whether CSD is enabled and supported by the HAL on this device. */ @TestApi @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) diff --git a/media/java/android/media/projection/MediaProjectionManager.java b/media/java/android/media/projection/MediaProjectionManager.java index f327e4e76f16..30fccf485b24 100644 --- a/media/java/android/media/projection/MediaProjectionManager.java +++ b/media/java/android/media/projection/MediaProjectionManager.java @@ -35,6 +35,27 @@ import java.util.Map; /** * Manages the retrieval of certain types of {@link MediaProjection} tokens. + * + * <p><ol>An example flow of starting a media projection will be: + * <li>Declare a foreground service with the type {@code mediaProjection} in + * the {@code AndroidManifest.xml}. + * </li> + * <li>Create an intent by calling {@link MediaProjectionManager#createScreenCaptureIntent()} + * and pass this intent to {@link Activity#startActivityForResult(Intent, int)}. + * </li> + * <li>On getting {@link Activity#onActivityResult(int, int, Intent)}, + * start the foreground service with the type + * {@link android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION}. + * </li> + * <li>Retrieve the media projection token by calling + * {@link MediaProjectionManager#getMediaProjection(int, Intent)} with the result code and + * intent from the {@link Activity#onActivityResult(int, int, Intent)} above. + * </li> + * <li>Start the screen capture session for media projection by calling + * {@link MediaProjection#createVirtualDisplay(String, int, int, int, int, Surface, + * android.hardware.display.VirtualDisplay.Callback, Handler)}. + * </li> + * </ol> */ @SystemService(Context.MEDIA_PROJECTION_SERVICE) public final class MediaProjectionManager { @@ -170,6 +191,17 @@ public final class MediaProjectionManager { * <a href="/guide/topics/manifest/service-element"><code><service></code></a> element of * the app's manifest file. * </p> + * <p> + * For an app targeting SDK version {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE U} or + * later, the user must have granted the app with the permission to start a projection, + * before the app starts a foreground service with the type + * {@link android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION}. + * Additionally, the app must have started the foreground service with that type before calling + * this API here, or else it'll receive a {@link SecurityException} from this API call, unless + * it's a privileged app. Apps can request the permission via the + * {@link #createScreenCaptureIntent()} and {@link Activity#startActivityForResult(Intent, int)} + * (or similar APIs). + * </p> * * @param resultCode The result code from {@link Activity#onActivityResult(int, int, Intent) * onActivityResult(int, int, Intent)}. diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index bf264f8f6ec4..031c3fff1e8f 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -107,7 +107,7 @@ public final class MediaSessionManager { private final Map<OnMediaKeyEventSessionChangedListener, Executor> mMediaKeyEventSessionChangedCallbacks = new HashMap<>(); @GuardedBy("mLock") - private String mCurMediaKeyEventSessionPackage; + private String mCurMediaKeyEventSessionPackage = ""; @GuardedBy("mLock") private MediaSession.Token mCurMediaKeyEventSession; @GuardedBy("mLock") diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 3a990b3dd6a9..80a3e70fbd28 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -249,7 +249,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand } case DO_SELECT_AUDIO_PRESENTATION: { SomeArgs args = (SomeArgs) msg.obj; - mTvInputSessionImpl.selectAudioPresentation(args.argi1, args.argi2); + mTvInputSessionImpl.selectAudioPresentation( + (Integer) args.arg1, (Integer) args.arg2); args.recycle(); break; } @@ -348,8 +349,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand @Override public void selectAudioPresentation(int presentationId, int programId) { - mCaller.executeOrSendMessage(mCaller.obtainMessageII(DO_SELECT_AUDIO_PRESENTATION, - presentationId, programId)); + mCaller.executeOrSendMessage( + mCaller.obtainMessageOO(DO_SELECT_AUDIO_PRESENTATION, presentationId, programId)); } @Override diff --git a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java index d3f598a7c009..253ade809ece 100644 --- a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java +++ b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java @@ -594,7 +594,7 @@ public class ITvInteractiveAppSessionWrapper @Override public void notifyRecordingScheduled(String recordingId, String requestId) { mCaller.executeOrSendMessage(mCaller.obtainMessageOO( - DO_NOTIFY_RECORDING_SCHEDULED, recordingId, recordingId)); + DO_NOTIFY_RECORDING_SCHEDULED, recordingId, requestId)); } @Override diff --git a/media/java/android/media/tv/interactive/TvInteractiveAppManager.java b/media/java/android/media/tv/interactive/TvInteractiveAppManager.java index fc8fe5c30967..06d1acd4567c 100755 --- a/media/java/android/media/tv/interactive/TvInteractiveAppManager.java +++ b/media/java/android/media/tv/interactive/TvInteractiveAppManager.java @@ -1420,7 +1420,7 @@ public final class TvInteractiveAppManager { return; } try { - mService.notifyRecordingScheduled(mToken, recordingId, recordingId, mUserId); + mService.notifyRecordingScheduled(mToken, recordingId, requestId, mUserId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/packages/CarrierDefaultApp/res/values-af/strings.xml b/packages/CarrierDefaultApp/res/values-af/strings.xml index 64cc776abc9c..56dd89a05bba 100644 --- a/packages/CarrierDefaultApp/res/values-af/strings.xml +++ b/packages/CarrierDefaultApp/res/values-af/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Diensverskafferkommunikasie"</string> <string name="android_system_label" msgid="2797790869522345065">"Selfoondiensverskaffer"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobiele data is op"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Jou mobiele data is gedeaktiveer"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Byvoorbeeld, die aanmeldbladsy behoort dalk nie aan die organisasie wat gewys word nie."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Gaan in elk geval deur blaaier voort"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Prestasiehupstoot"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-opsies van jou diensverskaffer"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Besoek %s se webwerf om opsies vir jou appervaring te sien"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Nie nou nie"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Bestuur"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Koop ’n prestasiehupstoot."</string> diff --git a/packages/CarrierDefaultApp/res/values-am/strings.xml b/packages/CarrierDefaultApp/res/values-am/strings.xml index 1bbc190ecb3f..e62610583c7c 100644 --- a/packages/CarrierDefaultApp/res/values-am/strings.xml +++ b/packages/CarrierDefaultApp/res/values-am/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"የአገልግሎት አቅራቢ ግንኙነቶች"</string> <string name="android_system_label" msgid="2797790869522345065">"የተንቀሳቃሽ ስልክ አገልግሎት አቅራቢ"</string> <string name="portal_notification_id" msgid="5155057562457079297">"የተንቀሳቃሽ ስልክ ውሂብ አልቋል"</string> <string name="no_data_notification_id" msgid="668400731803969521">"የእርስዎ የተንቀሳቃሽ ስልክ ውሂብ ቦዝኗል"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ለምሳሌ፣ የመግቢያ ገጹ የሚታየው ድርጅት ላይሆን ይችላል።"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ለማንኛውም በአሳሽ በኩል ይቀጥሉ"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"የአፈጻጸም ጭማሪ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5ጂ አማራጮች ከአገልግሎት አቅራቢዎ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ለመተግበሪያዎ ተሞክሮ አማራጮችን ለማየት የ%s ድር ጣቢያን ይጎብኙ"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"አሁን አይደለም"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"አስተዳድር"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"የአፈጻጸም ጭማሪ ይግዙ።"</string> diff --git a/packages/CarrierDefaultApp/res/values-as/strings.xml b/packages/CarrierDefaultApp/res/values-as/strings.xml index 56e2da507616..860b82c7dbaa 100644 --- a/packages/CarrierDefaultApp/res/values-as/strings.xml +++ b/packages/CarrierDefaultApp/res/values-as/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"বাহকৰ যোগাযোগ"</string> <string name="android_system_label" msgid="2797790869522345065">"ম’বাইল সেৱা প্ৰদান কৰা কোম্পানী"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ম’বাইল ডেটা শেষ হৈছে"</string> <string name="no_data_notification_id" msgid="668400731803969521">"আপোনাৰ ম’বাইল ডেটা সেৱা নিষ্ক্ৰিয় কৰা হৈছে"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"উদাহৰণস্বৰূপে, আপোনাক দেখুওৱা লগ ইনৰ পৃষ্ঠাটো প্ৰতিষ্ঠানটোৰ নিজা নহ\'বও পাৰে।"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"তথাপিও ব্ৰাউজাৰৰ জৰিয়তে অব্যাহত ৰাখক"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"কাৰ্যক্ষমতা পৰিৱৰ্ধন"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"আপোনাৰ বাহকে আগবঢ়োৱা 5G বিকল্পসমূহ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"আপোনাৰ এপৰ অভিজ্ঞতাৰ বাবে বিকল্পসমূহ চাবলৈ %sৰ ৱেবছাইটলৈ যাওক"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"এতিয়া নহয়"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"পৰিচালনা কৰক"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"এটা কাৰ্যক্ষমতা পৰিৱৰ্ধন ক্ৰয় কৰক।"</string> diff --git a/packages/CarrierDefaultApp/res/values-az/strings.xml b/packages/CarrierDefaultApp/res/values-az/strings.xml index 9677b62d3da0..5be5740a002d 100644 --- a/packages/CarrierDefaultApp/res/values-az/strings.xml +++ b/packages/CarrierDefaultApp/res/values-az/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operator Kommunikasiyaları"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobil Operator"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobil data bitib"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobil data deaktiv edilib"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Məsələn, giriş səhifəsi göstərilən təşkilata aid olmaya bilər."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Hər bir halda brazuer ilə davam edin"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performans artırması"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operatorunuzdan 5G seçimləri"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Tətbiq təcrübəsi üzrə seçimlərə baxmaq üçün %s veb-saytına daxil olun"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"İndi yox"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"İdarə edin"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Performans artırması alın."</string> diff --git a/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml b/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml index fc16b14742fa..3d2e4805f79a 100644 --- a/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml +++ b/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Obaveštenja mobilnog operatera"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilni operater"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobilni podaci su potrošeni"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobilni podaci su deaktivirani"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Na primer, stranica za prijavljivanje možda ne pripada prikazanoj organizaciji."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Ipak nastavi preko pregledača"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Poboljšanje učinka"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G opcije mobilnog operatera"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Opcije za doživljaj aplikacije potražite na veb-sajtu mobilnog operatera %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ne sada"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Upravljaj"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kupite poboljšanje učinka."</string> diff --git a/packages/CarrierDefaultApp/res/values-bg/strings.xml b/packages/CarrierDefaultApp/res/values-bg/strings.xml index 966ec33da8ce..95bd04b767c4 100644 --- a/packages/CarrierDefaultApp/res/values-bg/strings.xml +++ b/packages/CarrierDefaultApp/res/values-bg/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Съобщения от оператора"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобилен оператор"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобилните данни са изразходвани"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобилните ви данни са деактивирани"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Например страницата за вход може да не принадлежи на показаната организация."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Продължаване през браузър въпреки това"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Увеличаване на ефективността"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Опции за 5G от оператора ви"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"За да видите опции за практическата си работа с приложението, посетете уебсайта на %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не сега"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Управление"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Купете пакет за увеличаване на ефективността."</string> diff --git a/packages/CarrierDefaultApp/res/values-bn/strings.xml b/packages/CarrierDefaultApp/res/values-bn/strings.xml index 46eeb749f0d0..516dd89d9bc3 100644 --- a/packages/CarrierDefaultApp/res/values-bn/strings.xml +++ b/packages/CarrierDefaultApp/res/values-bn/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"পরিষেবা প্রদানকারীর সাথে যোগাযোগ"</string> <string name="android_system_label" msgid="2797790869522345065">"পরিষেবা প্রদানকারী"</string> <string name="portal_notification_id" msgid="5155057562457079297">"মোবাইল ডেটা ফুরিয়ে গেছে"</string> <string name="no_data_notification_id" msgid="668400731803969521">"আপনার মোবাইল ডেটা নিষ্ক্রিয় করা হয়েছে"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"যেমন, লগ-ইন পৃষ্ঠাটি যে প্রতিষ্ঠানের পৃষ্ঠা বলে দেখানো আছে, আসলে তা নাও হতে পারে৷"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"যাই হোক, ব্রাউজারের মাধ্যমে চালিয়ে যান"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"পারফর্ম্যান্স বুস্ট"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"আপনার পরিষেবা প্রদানকারীর থেকে পাওয়া 5G বিকল্প"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"আপনার অ্যাপ সংক্রান্ত অভিজ্ঞতা উন্নত করার বিকল্পগুলি দেখতে, %s-এর ওয়েবসাইট ভিজিট করুন"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"এখন নয়"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ম্যানেজ করুন"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"পারফর্ম্যান্স বুস্ট সংক্রান্ত ফিচার কিনুন।"</string> diff --git a/packages/CarrierDefaultApp/res/values-bs/strings.xml b/packages/CarrierDefaultApp/res/values-bs/strings.xml index d41ad211314f..61d8dc8712ff 100644 --- a/packages/CarrierDefaultApp/res/values-bs/strings.xml +++ b/packages/CarrierDefaultApp/res/values-bs/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikacije putem operatera"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilni operater"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobilni internet je potrošen"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Prijenos podataka na mobilnoj mreži je deaktiviran"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Naprimjer, stranica za prijavljivanje možda ne pripada prikazanoj organizaciji."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Ipak nastavi preko preglednika"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Pojačavanje performansi"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opcije 5G mreže operatera"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Posjetite web lokaciju operatera %s da vidite opcije za iskustvo u aplikaciji"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ne sada"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Upravljajte"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kupite pojačavanje performansi."</string> diff --git a/packages/CarrierDefaultApp/res/values-ca/strings.xml b/packages/CarrierDefaultApp/res/values-ca/strings.xml index afde9193c9a9..ec032d5281df 100644 --- a/packages/CarrierDefaultApp/res/values-ca/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ca/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicacions de l\'operador"</string> <string name="android_system_label" msgid="2797790869522345065">"Operador de telefonia mòbil"</string> <string name="portal_notification_id" msgid="5155057562457079297">"S\'han esgotat les dades mòbils"</string> <string name="no_data_notification_id" msgid="668400731803969521">"S\'han desactivat les dades mòbils"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Per exemple, la pàgina d\'inici de sessió podria no pertànyer a l\'organització que es mostra."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continua igualment mitjançant el navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Optimització de rendiment"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opcions 5G del teu operador"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visita el lloc web de %s per veure les opcions relacionades amb la teva experiència a l\'aplicació"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ara no"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gestiona"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Compra una optimització de rendiment."</string> diff --git a/packages/CarrierDefaultApp/res/values-de/strings.xml b/packages/CarrierDefaultApp/res/values-de/strings.xml index 65e2fd5aa44f..b4cdc561163a 100644 --- a/packages/CarrierDefaultApp/res/values-de/strings.xml +++ b/packages/CarrierDefaultApp/res/values-de/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Kommunikation mit Mobilfunkanbieter"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilfunkanbieter"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile Daten sind aufgebraucht"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Deine mobilen Daten wurden deaktiviert"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Beispiel: Die Log-in-Seite gehört eventuell nicht zur angezeigten Organisation."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Trotzdem in einem Browser fortfahren"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Leistungs-Boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-Optionen von deinem Mobilfunkanbieter"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Besuche die Website von %s, um dir die Optionen für deine App anzusehen"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Nicht jetzt"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Verwalten"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Leistungs-Boost erwerben."</string> diff --git a/packages/CarrierDefaultApp/res/values-el/strings.xml b/packages/CarrierDefaultApp/res/values-el/strings.xml index 7a55d3a8c68e..8a6430d39b31 100644 --- a/packages/CarrierDefaultApp/res/values-el/strings.xml +++ b/packages/CarrierDefaultApp/res/values-el/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Επικοινωνίες εταιρείας κινητής τηλεφωνίας"</string> <string name="android_system_label" msgid="2797790869522345065">"Εταιρεία κινητής τηλεφωνίας"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Τα δεδομένα κινητής τηλεφωνίας εξαντλήθηκαν"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Τα δεδομένα κινητής τηλεφωνίας έχουν απενεργοποιηθεί"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Για παράδειγμα, η σελίδα σύνδεσης ενδέχεται να μην ανήκει στον οργανισμό που εμφανίζεται."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Συνέχεια ούτως ή άλλως μέσω του προγράμματος περιήγησης"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Ενίσχυση απόδοσης"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Επιλογές 5G από την εταιρεία κινητής τηλεφωνίας σας"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Επισκεφτείτε τον ιστότοπο %s για να δείτε επιλογές για την εμπειρία της εφαρμογής σας"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Όχι τώρα"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Διαχείριση"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Αγοράστε μια ενίσχυση απόδοσης."</string> diff --git a/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml b/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml index 9d6b0132e6a5..1f2089667f2e 100644 --- a/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml +++ b/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operator communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Operator"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page might not belong to the organisation shown."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performance boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G options from your operator"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visit %s\'s website to see options for your app experience"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Not now"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Manage"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Purchase a performance boost."</string> diff --git a/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml b/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml index 00c03577c179..c084a0a7c74e 100644 --- a/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml +++ b/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Carrier"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page may not belong to the organization shown."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performance boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G options from your carrier"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visit %s\'s website to see options for your app experience"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Not now"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Manage"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Purchase a performance boost."</string> diff --git a/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml b/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml index 9d6b0132e6a5..1f2089667f2e 100644 --- a/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml +++ b/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operator communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Operator"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page might not belong to the organisation shown."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performance boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G options from your operator"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visit %s\'s website to see options for your app experience"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Not now"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Manage"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Purchase a performance boost."</string> diff --git a/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml b/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml index 9d6b0132e6a5..1f2089667f2e 100644 --- a/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml +++ b/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operator communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Operator"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page might not belong to the organisation shown."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performance boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G options from your operator"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visit %s\'s website to see options for your app experience"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Not now"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Manage"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Purchase a performance boost."</string> diff --git a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml b/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml index 7f7456d10c63..01789251e3d0 100644 --- a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml +++ b/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Carrier"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page may not belong to the organization shown."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performance boost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G options from your carrier"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visit %s\'s website to see options for your app experience"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Not now"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Manage"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Purchase a performance boost."</string> diff --git a/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml b/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml index 85598235fe46..5bf0e6e15f77 100644 --- a/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml +++ b/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicaciones de operadores"</string> <string name="android_system_label" msgid="2797790869522345065">"Compañía de telefonía móvil"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Se agotó el servicio de datos móviles"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Se desactivaron los datos móviles"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Por ejemplo, es posible que la página de acceso no pertenezca a la organización que aparece."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar de todos modos desde el navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Aumento de rendimiento"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opciones de 5G de tu operador"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visita el sitio web de %s para ver opciones de tu experiencia en la app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ahora no"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Administrar"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Compra un aumento de rendimiento."</string> diff --git a/packages/CarrierDefaultApp/res/values-es/strings.xml b/packages/CarrierDefaultApp/res/values-es/strings.xml index b9fa4c0d4c25..2a41c8993eed 100644 --- a/packages/CarrierDefaultApp/res/values-es/strings.xml +++ b/packages/CarrierDefaultApp/res/values-es/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicaciones del operador"</string> <string name="android_system_label" msgid="2797790869522345065">"Operador de telefonía móvil"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Se han agotado los datos móviles"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Se han desactivado los datos móviles"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Por ejemplo, es posible que la página de inicio de sesión no pertenezca a la organización mostrada."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar de todos modos a través del navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Mejora de rendimiento"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opciones 5G de tu operador"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visita el sitio web de %s para ver opciones relacionadas con tu experiencia en la aplicación"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ahora no"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gestionar"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Comprar una mejora de rendimiento."</string> diff --git a/packages/CarrierDefaultApp/res/values-et/strings.xml b/packages/CarrierDefaultApp/res/values-et/strings.xml index e51b76c328a9..c1a33d0f4761 100644 --- a/packages/CarrierDefaultApp/res/values-et/strings.xml +++ b/packages/CarrierDefaultApp/res/values-et/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobiilioperaator"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobiilse andmeside limiit on täis"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Teie mobiilne andmeside on inaktiveeritud"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Näiteks ei pruugi sisselogimisleht kuuluda kuvatavale organisatsioonile."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Jätka siiski brauseris"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Jõudluse võimendus"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G valikud teie operaatorilt"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Külastage operaatori %s veebisaiti, et näha oma rakenduse kasutuskogemuse valikuid"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Mitte praegu"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Haldamine"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Ostke jõudluse võimendus."</string> diff --git a/packages/CarrierDefaultApp/res/values-eu/strings.xml b/packages/CarrierDefaultApp/res/values-eu/strings.xml index 36506351d9f5..86e12915a23c 100644 --- a/packages/CarrierDefaultApp/res/values-eu/strings.xml +++ b/packages/CarrierDefaultApp/res/values-eu/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operadorearekiko komunikazioa"</string> <string name="android_system_label" msgid="2797790869522345065">"Telefonia mugikorreko operadorea"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Agortu egin da datu-konexioa"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Desaktibatu da datu-konexioa"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Adibidez, baliteke saioa hasteko orria adierazitako erakundearena ez izatea."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Jarraitu arakatzailearen bidez, halere"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Errendimendu-hobekuntza"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operadoreak eskaintzen dituen 5G-aren aukerak"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Joan %s operadorearen webgunera aplikazioaren erabileraren inguruko aukerak ikusteko"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Orain ez"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Kudeatu"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Erosi errendimendu-hobekuntza bat."</string> diff --git a/packages/CarrierDefaultApp/res/values-fa/strings.xml b/packages/CarrierDefaultApp/res/values-fa/strings.xml index 0738cbfe57d5..89c184cf2e73 100644 --- a/packages/CarrierDefaultApp/res/values-fa/strings.xml +++ b/packages/CarrierDefaultApp/res/values-fa/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"ارتباطات شرکت مخابراتی"</string> <string name="android_system_label" msgid="2797790869522345065">"شرکت مخابراتی دستگاه همراه"</string> <string name="portal_notification_id" msgid="5155057562457079297">"داده تلفن همراه تمام شده است"</string> <string name="no_data_notification_id" msgid="668400731803969521">"داده شبکه تلفن همراه شما غیرفعال شده است"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"به عنوان مثال، صفحه ورود به سیستم ممکن است متعلق به سازمان نشان داده شده نباشد."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"درهر صورت ازطریق مرورگر ادامه یابد"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"تقویتکننده عملکرد"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"گزینههای نسل پنجم شرکت مخابراتی شما"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"برای دیدن گزینههای مرتبط با تجربه برنامه، به وبسایت %s مراجعه کنید"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"اکنون نه"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"مدیریت"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"تقویتکننده عملکرد خریداری کنید."</string> diff --git a/packages/CarrierDefaultApp/res/values-fr/strings.xml b/packages/CarrierDefaultApp/res/values-fr/strings.xml index 1d06a1d7cb7d..4bc03ffab291 100644 --- a/packages/CarrierDefaultApp/res/values-fr/strings.xml +++ b/packages/CarrierDefaultApp/res/values-fr/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Opérateur des communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Opérateur mobile"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Les données mobiles sont épuisées"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Les données mobiles ont été désactivées pour votre compte"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Par exemple, la page de connexion peut ne pas appartenir à l\'organisation représentée."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuer quand même dans le navigateur"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Boost de performances"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Options 5G de votre opérateur"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Accédez au site Web de %s pour consulter les options pour l\'expérience de votre appli"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Pas maintenant"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gérer"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Achetez un boost de performances."</string> diff --git a/packages/CarrierDefaultApp/res/values-gu/strings.xml b/packages/CarrierDefaultApp/res/values-gu/strings.xml index d003a44926cd..1d42e8f8340c 100644 --- a/packages/CarrierDefaultApp/res/values-gu/strings.xml +++ b/packages/CarrierDefaultApp/res/values-gu/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"મોબાઇલ ઑપરેટર તરફથી કમ્યુનિકેશન"</string> <string name="android_system_label" msgid="2797790869522345065">"મોબાઇલ કૅરિઅર"</string> <string name="portal_notification_id" msgid="5155057562457079297">"મોબાઇલ ડેટા પૂરો થઈ ગયો છે"</string> <string name="no_data_notification_id" msgid="668400731803969521">"તમારો મોબાઇલ ડેટા નિષ્ક્રિય કરવામાં આવ્યો છે"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ઉદાહરણ તરીકે, લોગિન પૃષ્ઠ બતાવવામાં આવેલી સંસ્થાનું ન પણ હોય."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"તો પણ બ્રાઉઝર મારફતે ચાલુ રાખો"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"પર્ફોર્મન્સ બૂસ્ટ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"તમારા મોબાઇલ ઑપરેટર તરફથી 5G વિકલ્પો"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"તમારા ઍપ અનુભવ માટેના વિકલ્પો જોવા માટે %sની વેબસાઇટની મુલાકાત લો"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"હમણાં નહીં"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"મેનેજ કરો"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"પર્ફોર્મન્સ બૂસ્ટ ખરીદો."</string> diff --git a/packages/CarrierDefaultApp/res/values-hi/strings.xml b/packages/CarrierDefaultApp/res/values-hi/strings.xml index 6b3c5444d944..a830d7764b8c 100644 --- a/packages/CarrierDefaultApp/res/values-hi/strings.xml +++ b/packages/CarrierDefaultApp/res/values-hi/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"मोबाइल सेवा देने वाली कंपनी"</string> <string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा खत्म हो गया है"</string> <string name="no_data_notification_id" msgid="668400731803969521">"आपका मोबाइल डेटा बंद कर दिया गया है"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"उदाहरण के लिए, हो सकता है कि लॉगिन पेज दिखाए गए संगठन का ना हो."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ब्राउज़र के ज़रिए किसी भी तरह जारी रखें"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"परफ़ॉर्मेंस बूस्ट"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी से मिले 5G के विकल्प"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ऐप्लिकेशन का बेहतर अनुभव पाने के लिए, %s की वेबसाइट पर जाकर विकल्प देखें"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"अभी नहीं"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"मैनेज करें"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"कोई परफ़ॉर्मेंस बूस्ट खरीदें."</string> diff --git a/packages/CarrierDefaultApp/res/values-hr/strings.xml b/packages/CarrierDefaultApp/res/values-hr/strings.xml index 1a58080eaa86..34bf6015a222 100644 --- a/packages/CarrierDefaultApp/res/values-hr/strings.xml +++ b/packages/CarrierDefaultApp/res/values-hr/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikacije operatera"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilni operater"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobilni su podaci potrošeni"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobilni su podaci deaktivirani"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Na primjer, stranica za prijavu možda ne pripada prikazanoj organizaciji."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Ipak nastavi putem preglednika"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Poboljšanje izvedbe"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opcije 5G mreže vašeg operatera"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Posjetite web-lokaciju %s za prikaz opcija za doživljaj aplikacije"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ne sad"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Upravljajte"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kupite poboljšanje izvedbe."</string> diff --git a/packages/CarrierDefaultApp/res/values-hu/strings.xml b/packages/CarrierDefaultApp/res/values-hu/strings.xml index 6ed1efe7cebd..13ac0a16a439 100644 --- a/packages/CarrierDefaultApp/res/values-hu/strings.xml +++ b/packages/CarrierDefaultApp/res/values-hu/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Szolgáltatói értesítések"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilszolgáltató"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Elérte a rendelkezésre álló mobiladat-mennyiséget"</string> <string name="no_data_notification_id" msgid="668400731803969521">"A rendszer deaktiválta a mobiladat-forgalmat"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Például lehetséges, hogy a bejelentkezési oldal nem a megjelenített szervezethez tartozik."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Folytatás ennek ellenére böngészőn keresztül"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Teljesítménynövelés"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-beállítások a szolgáltatótól"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"A(z) %s webhelyén megtekintheti az alkalmazás által nyújtott élményekhez tartozó beállításokat"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Most nem"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Kezelés"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Vásároljon teljesítménynövelést."</string> diff --git a/packages/CarrierDefaultApp/res/values-in/strings.xml b/packages/CarrierDefaultApp/res/values-in/strings.xml index cb0f35b0ef7d..f9a9732112b9 100644 --- a/packages/CarrierDefaultApp/res/values-in/strings.xml +++ b/packages/CarrierDefaultApp/res/values-in/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikasi Operator"</string> <string name="android_system_label" msgid="2797790869522345065">"Operator Seluler"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Data seluler telah habis"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Data seluler telah dinonaktifkan"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Misalnya, halaman login mungkin bukan milik organisasi yang ditampilkan."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Tetap lanjutkan melalui browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Penguat sinyal"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opsi 5G dari operator Anda"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Buka situs %s untuk melihat opsi pengalaman aplikasi Anda"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Lain kali"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Kelola"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Beli penguat sinyal."</string> diff --git a/packages/CarrierDefaultApp/res/values-is/strings.xml b/packages/CarrierDefaultApp/res/values-is/strings.xml index 1e5fa784f1c1..ca9d6c7887e0 100644 --- a/packages/CarrierDefaultApp/res/values-is/strings.xml +++ b/packages/CarrierDefaultApp/res/values-is/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Samskipti við símafyrirtæki"</string> <string name="android_system_label" msgid="2797790869522345065">"Símafyrirtæki"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Farsímagögn kláruðust"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Slökkt hefur verið á farsímagögnum"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Til dæmis getur verið að innskráningarsíðan tilheyri ekki fyrirtækinu sem birtist."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Halda samt áfram í vafra"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Afkastaaukning"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-valkostir frá símafyrirtækinu"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Opnaðu vefsvæði %s til að sjá valkosti varðandi upplifun í forritinu"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ekki núna"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Stjórna"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kaupa afkastaaukningu."</string> diff --git a/packages/CarrierDefaultApp/res/values-iw/strings.xml b/packages/CarrierDefaultApp/res/values-iw/strings.xml index 3551acf22dc6..9e5a8b55bae6 100644 --- a/packages/CarrierDefaultApp/res/values-iw/strings.xml +++ b/packages/CarrierDefaultApp/res/values-iw/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"מידע מהספק"</string> <string name="android_system_label" msgid="2797790869522345065">"ספק שירות לנייד"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ניצלת את מכסת הנתונים הסלולריים"</string> <string name="no_data_notification_id" msgid="668400731803969521">"חבילת הגלישה שלך הושבתה"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"לדוגמה, ייתכן שדף ההתחברות אינו שייך לארגון המוצג."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"המשך בכל זאת באמצעות דפדפן"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"שיפור ביצועים"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"אפשרויות של רשת 5G מהספק"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ניתן להיכנס לאתר של %s כדי לראות אפשרויות נוספות לחוויית השימוש באפליקציה"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"לא עכשיו"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ניהול"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"רכישת שיפור ביצועים."</string> diff --git a/packages/CarrierDefaultApp/res/values-ka/strings.xml b/packages/CarrierDefaultApp/res/values-ka/strings.xml index ee281d78a436..4488a55a8afe 100644 --- a/packages/CarrierDefaultApp/res/values-ka/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ka/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"ოპერატორთან კომუნიკაცია"</string> <string name="android_system_label" msgid="2797790869522345065">"მობილური ოპერატორი"</string> <string name="portal_notification_id" msgid="5155057562457079297">"მობილური ინტერნეტის პაკეტი ამოიწურა"</string> <string name="no_data_notification_id" msgid="668400731803969521">"მობილური ინტერნეტი დეაქტივირებულია"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"მაგალითად, სისტემაში შესვლის გვერდი შეიძლება არ ეკუთვნოდეს ნაჩვენებ ორგანიზაციას."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"მაინც ბრაუზერში გაგრძელება"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ეფექტურობის გაძლიერება"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G ვარიანტები თქვენი ოპერატორისგან"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ეწვიეთ %s-ის ვებსაიტს თქვენი აპის გამოცდილების ვარიანტების სანახავად"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ახლა არა"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"მართვა"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ეფექტურობის გაძლიერების შეძენა."</string> diff --git a/packages/CarrierDefaultApp/res/values-kk/strings.xml b/packages/CarrierDefaultApp/res/values-kk/strings.xml index b5f69504de62..ad91c79f458e 100644 --- a/packages/CarrierDefaultApp/res/values-kk/strings.xml +++ b/packages/CarrierDefaultApp/res/values-kk/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Оператор байланыстары"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобильдік байланыс операторы"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобильдік интернет бітті"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобильдік интернет өшірілді"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Мысалы, кіру беті көрсетілген ұйымға тиесілі болмауы мүмкін."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Бәрібір браузер арқылы жалғастыру"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Өнімділікті арттыру"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Оператор ұсынған 5G опциялары"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Қолданбаның жұмысына арналған опцияларды көру үшін %s веб-сайтына кіріңіз."</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Қазір емес"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Басқару"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Өнімділікті арттыру құралын сатып алыңыз."</string> diff --git a/packages/CarrierDefaultApp/res/values-km/strings.xml b/packages/CarrierDefaultApp/res/values-km/strings.xml index 20199a7b06f4..18524899af1f 100644 --- a/packages/CarrierDefaultApp/res/values-km/strings.xml +++ b/packages/CarrierDefaultApp/res/values-km/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"ទំនាក់ទំនងរបស់ក្រុមហ៊ុនសេវាទូរសព្ទ"</string> <string name="android_system_label" msgid="2797790869522345065">"ក្រុមហ៊ុនបម្រើសេវាទូរសព្ទចល័ត"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ទិន្នន័យចល័តបានអស់ហើយ"</string> <string name="no_data_notification_id" msgid="668400731803969521">"ទិន្នន័យចល័តរបស់អ្នកត្រូវបានបិទដំណើរការហើយ"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ឧទាហរណ៍៖ ទំព័រចូលនេះអាចនឹងមិនមែនជាកម្មសិទ្ធិរបស់ស្ថាប័នដែលបានបង្ហាញនេះទេ។"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"យ៉ាងណាក៏ដោយនៅតែបន្តតាមរយៈកម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ការបង្កើនប្រតិបត្តិការ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"ជម្រើស 5G ពីក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ចូលទៅកាន់គេហទំព័ររបស់ %s ដើម្បីមើលជម្រើសសម្រាប់បទពិសោធន៍ប្រើកម្មវិធីរបស់អ្នក"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"កុំទាន់"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"គ្រប់គ្រង"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ទិញការបង្កើនប្រតិបត្តិការ។"</string> diff --git a/packages/CarrierDefaultApp/res/values-kn/strings.xml b/packages/CarrierDefaultApp/res/values-kn/strings.xml index 619b92a0dc5a..bc3e1cc16f9d 100644 --- a/packages/CarrierDefaultApp/res/values-kn/strings.xml +++ b/packages/CarrierDefaultApp/res/values-kn/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"ವಾಹಕ ಸಂವಹನಗಳು"</string> <string name="android_system_label" msgid="2797790869522345065">"ಮೊಬೈಲ್ ವಾಹಕ"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ಮೊಬೈಲ್ ಡೇಟಾ ಮುಗಿದುಹೋಗಿದೆ"</string> <string name="no_data_notification_id" msgid="668400731803969521">"ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ಉದಾಹರಣೆಗೆ, ಲಾಗಿನ್ ಪುಟವು ತೋರಿಸಲಾಗಿರುವ ಸಂಸ್ಥೆಗೆ ಸಂಬಂಧಿಸಿಲ್ಲದಿರಬಹುದು."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ಪರವಾಗಿಲ್ಲ, ಬ್ರೌಸರ್ ಮೂಲಕ ಮುಂದುವರಿಸಿ"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ಕಾರ್ಯಕ್ಷಮತೆ ಬೂಸ್ಟ್"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"ನಿಮ್ಮ ವಾಹಕದಿಂದ 5G ಆಯ್ಕೆಗಳು"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ನಿಮ್ಮ ಆ್ಯಪ್ ಅನುಭವಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ನೋಡಲು %s ನ ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಿ"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ಈಗ ಬೇಡ"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ನಿರ್ವಹಿಸಿ"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ಕಾರ್ಯಕ್ಷಮತೆ ಬೂಸ್ಟ್ ಅನ್ನು ಖರೀದಿಸಿ."</string> diff --git a/packages/CarrierDefaultApp/res/values-ko/strings.xml b/packages/CarrierDefaultApp/res/values-ko/strings.xml index 46e172da378e..4e82d251c83d 100644 --- a/packages/CarrierDefaultApp/res/values-ko/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ko/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"이동통신사 커뮤니케이션"</string> <string name="android_system_label" msgid="2797790869522345065">"이동통신사"</string> <string name="portal_notification_id" msgid="5155057562457079297">"모바일 데이터가 소진되었습니다."</string> <string name="no_data_notification_id" msgid="668400731803969521">"모바일 데이터가 비활성화되었습니다."</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"예를 들어 로그인 페이지가 표시된 조직에 속하지 않을 수 있습니다."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"브라우저를 통해 계속하기"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"성능 향상"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"이동통신사의 5G 옵션"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"%s 웹사이트에 방문하여 앱 환경에 관한 옵션을 확인하세요."</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"나중에"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"관리"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"성능 향상 구매"</string> diff --git a/packages/CarrierDefaultApp/res/values-ky/strings.xml b/packages/CarrierDefaultApp/res/values-ky/strings.xml index f2a96bc8ef77..aa6a1320ac92 100644 --- a/packages/CarrierDefaultApp/res/values-ky/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ky/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Байланыш операторунун билдирмелери"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобилдик байланыш оператору"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобилдик Интернетиңиздин трафиги түгөндү"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобилдик Интернет өчүрүлгөн"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Мисалы, аккаунтка кирүү баракчасы көрсөтүлгөн уюмга таандык эмес болушу мүмкүн."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Баары бир серепчи аркылуу улантуу"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Иштин майнаптуулугун жогорулатуу"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Байланыш операторунун 5G варианттары"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Колдонмону иштетүү параметрлерин көрүү үчүн %s сайтына өтүңүз"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Азыр эмес"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Тескөө"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Иштин майнаптуулугун жогорулатууну сатып алыңыз."</string> diff --git a/packages/CarrierDefaultApp/res/values-lo/strings.xml b/packages/CarrierDefaultApp/res/values-lo/strings.xml index 28af8307bbee..0624c72375f9 100644 --- a/packages/CarrierDefaultApp/res/values-lo/strings.xml +++ b/packages/CarrierDefaultApp/res/values-lo/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"ການສື່ສານຈາກຜູ້ໃຫ້ບໍລິການ"</string> <string name="android_system_label" msgid="2797790869522345065">"ຜູ້ໃຫ້ບໍລິການມືຖື"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ອິນເຕີເນັດມືຖືໝົດແລ້ວ"</string> <string name="no_data_notification_id" msgid="668400731803969521">"ປິດການນຳໃຊ້ອິນເຕີເນັດມືຖືຂອງທ່ານແລ້ວ"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ຕົວຢ່າງ, ໜ້າເຂົ້າສູ່ລະບົບອາດຈະບໍ່ແມ່ນຂອງອົງກອນທີ່ປາກົດ."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ດຳເນີນການຕໍ່ຜ່ານໂປຣແກຣມທ່ອງເວັບ"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ເລັ່ງປະສິດທິພາບ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"ຕົວເລືອກ 5G ຈາກຜູ້ໃຫ້ບໍລິການຂອງທ່ານ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ເບິ່ງຕົວເລືອກຕ່າງໆສຳລັບປະສົບການການນຳໃຊ້ແອັບຂອງທ່ານໄດ້ຢູ່ເວັບໄຊຂອງ %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ບໍ່ຟ້າວເທື່ອ"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ຈັດການ"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ຊື້ການເລັ່ງປະສິດທິພາບ."</string> diff --git a/packages/CarrierDefaultApp/res/values-lt/strings.xml b/packages/CarrierDefaultApp/res/values-lt/strings.xml index b9be33303ba2..8780eb0f0889 100644 --- a/packages/CarrierDefaultApp/res/values-lt/strings.xml +++ b/packages/CarrierDefaultApp/res/values-lt/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operatoriaus pranešimai"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobiliojo ryšio operatorius"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobiliojo ryšio duomenys baigėsi"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobiliojo ryšio duomenys išaktyvinti"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Pavyzdžiui, prisijungimo puslapis gali nepriklausyti rodomai organizacijai."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Vis tiek tęsti naudojant naršyklę"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Našumo pagerinimas"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operatoriaus teikiamos 5G parinktys"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Apsilankykite „%s“ svetainėje ir peržiūrėkite programos funkcijų parinktis"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ne dabar"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Tvarkyti"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Įsigykite našumo pagerinimo paslaugą."</string> diff --git a/packages/CarrierDefaultApp/res/values-lv/strings.xml b/packages/CarrierDefaultApp/res/values-lv/strings.xml index d539947925e7..a65fa5872c01 100644 --- a/packages/CarrierDefaultApp/res/values-lv/strings.xml +++ b/packages/CarrierDefaultApp/res/values-lv/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Paziņojumi no mobilo sakaru operatora"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilo sakaru operators"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Sasniegts mobilo datu ierobežojums."</string> <string name="no_data_notification_id" msgid="668400731803969521">"Jūsu mobilie dati ir deaktivizēti"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Piemēram, pieteikšanās lapa, iespējams, nepieder norādītajai organizācijai."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Tomēr turpināt, izmantojot pārlūkprogrammu"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Veiktspējas uzlabojums"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Mobilo sakaru operatora piedāvātās 5G iespējas"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Apmeklējiet operatora %s vietni, lai skatītu pieejamās iespējas lietotnē"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Vēlāk"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Pārvaldīt"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Iegādājieties veiktspējas uzlabojumu."</string> diff --git a/packages/CarrierDefaultApp/res/values-mk/strings.xml b/packages/CarrierDefaultApp/res/values-mk/strings.xml index 4efecb05c2ea..4965d563d9f3 100644 --- a/packages/CarrierDefaultApp/res/values-mk/strings.xml +++ b/packages/CarrierDefaultApp/res/values-mk/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Комуникации со давателот на услугата"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобилен оператор"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобилниот интернет е искористен"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобилниот интернет ви е деактивиран"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"На пример, страницата за најавување може да не припаѓа на прикажаната организација."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Сепак продолжи преку прелистувач"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Засилување на изведбата"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G опции од вашиот давател на услуга"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Посетете го веб-сајтот на %s за да ги видите опциите за искуството со апликацијата"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не сега"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Управувајте"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Купете засилување на изведбата."</string> diff --git a/packages/CarrierDefaultApp/res/values-ml/strings.xml b/packages/CarrierDefaultApp/res/values-ml/strings.xml index f4c19a3a274a..cfeacbe70fd7 100644 --- a/packages/CarrierDefaultApp/res/values-ml/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ml/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"സേവനദാതാവ് നടത്തുന്ന ആശയവിനിമയങ്ങൾ"</string> <string name="android_system_label" msgid="2797790869522345065">"മൊബൈൽ കാരിയർ"</string> <string name="portal_notification_id" msgid="5155057562457079297">"മൊബൈൽ ഡാറ്റ തീർന്നിരിക്കുന്നു"</string> <string name="no_data_notification_id" msgid="668400731803969521">"നിങ്ങളുടെ മൊബൈൽ ഡാറ്റ നിർജീവമാക്കി"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ഉദാഹരണത്തിന്, കാണിച്ചിരിക്കുന്ന ഓർഗനൈസേഷന്റേതായിരിക്കില്ല ലോഗിൻ പേജ്."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"എന്തായാലും ബ്രൗസർ വഴി തുടരുക"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"പ്രകടന ബൂസ്റ്റ്"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"നിങ്ങളുടെ സേവനദാതാവിൽ നിന്നുള്ള 5G ഓപ്ഷനുകൾ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"നിങ്ങളുടെ ആപ്പ് അനുഭവം സംബന്ധിച്ച ഓപ്ഷനുകൾക്ക് %s എന്നതിന്റെ വെബ്സൈറ്റ് സന്ദർശിക്കുക"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ഇപ്പോൾ വേണ്ട"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"മാനേജ് ചെയ്യുക"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"പ്രകടന ബൂസ്റ്റ് വാങ്ങൂ."</string> diff --git a/packages/CarrierDefaultApp/res/values-mn/strings.xml b/packages/CarrierDefaultApp/res/values-mn/strings.xml index 2f33eb2e71c6..3476ff072ebb 100644 --- a/packages/CarrierDefaultApp/res/values-mn/strings.xml +++ b/packages/CarrierDefaultApp/res/values-mn/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Оператор компанийн харилцаа холбоо"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобайл оператор компани"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобайл дата дууссан"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Таны мобайл датаг идэвхгүй болгосон"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Жишээлбэл нэвтрэх хуудас нь харагдаж буй байгууллагынх биш байж болно."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Ямар ч тохиолдолд хөтчөөр үргэлжлүүлэх"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Гүйцэтгэлийн идэвхжүүлэлт"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Таны оператор компанийн 5G сонголт"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Аппын хэрэглээнийхээ сонголтыг харахын тулд %s-н вебсайтад зочилно уу"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Одоо биш"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Удирдах"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Гүйцэтгэлийн идэвхжүүлэлтийг худалдаж аваарай."</string> diff --git a/packages/CarrierDefaultApp/res/values-mr/strings.xml b/packages/CarrierDefaultApp/res/values-mr/strings.xml index 941454592d5f..412304574996 100644 --- a/packages/CarrierDefaultApp/res/values-mr/strings.xml +++ b/packages/CarrierDefaultApp/res/values-mr/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"वाहकसह संभाषणे"</string> <string name="android_system_label" msgid="2797790869522345065">"मोबाइल वाहक"</string> <string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा संपला आहे"</string> <string name="no_data_notification_id" msgid="668400731803969521">"तुमचा मोबाइल डेटा निष्क्रिय केला गेला"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"उदाहरणार्थ, लॉग इन पृष्ठ दर्शवलेल्या संस्थेच्या मालकीचे नसू शकते."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"तरीही ब्राउझरद्वारे सुरू ठेवा"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"परफॉर्मन्स बूस्ट"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"तुमच्या वाहकाकडून 5G पर्याय"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"तुमच्या अॅप अनुभवासाठी पर्याय पाहण्याकरिता %s च्या वेबसाइटला भेट द्या"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"आता नको"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"व्यवस्थापित करा"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"परफॉर्मन्स बूस्ट खरेदी करा."</string> diff --git a/packages/CarrierDefaultApp/res/values-ms/strings.xml b/packages/CarrierDefaultApp/res/values-ms/strings.xml index 4fb377e674dd..004d092b5f41 100644 --- a/packages/CarrierDefaultApp/res/values-ms/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ms/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikasi Pembawa"</string> <string name="android_system_label" msgid="2797790869522345065">"Pembawa Mudah Alih"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Data mudah alih telah habis"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Data mudah alih anda telah dinyahaktifkan"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Contohnya, halaman log masuk mungkin bukan milik organisasi yang ditunjukkan."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Teruskan juga melalui penyemak imbas"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Peningkatan prestasi"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Pilihan 5G daripada pembawa anda"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Lawati laman web %s untuk melihat pilihan pengalaman apl anda"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Bukan sekarang"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Urus"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Beli perangsang prestasi."</string> diff --git a/packages/CarrierDefaultApp/res/values-my/strings.xml b/packages/CarrierDefaultApp/res/values-my/strings.xml index 002edd86d38d..6e1381f85220 100644 --- a/packages/CarrierDefaultApp/res/values-my/strings.xml +++ b/packages/CarrierDefaultApp/res/values-my/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"မိုဘိုင်းဖုန်းကုမ္ပဏီ ဆက်သွယ်မှုများ"</string> <string name="android_system_label" msgid="2797790869522345065">"မိုဘိုင်း ဝန်ဆောင်မှုပေးသူ"</string> <string name="portal_notification_id" msgid="5155057562457079297">"မိုဘိုင်းဒေတာ ကုန်သွားပါပြီ"</string> <string name="no_data_notification_id" msgid="668400731803969521">"သင်၏ မိုဘိုင်း ဒေတာကို ပိတ်ထားပါသည်"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ဥပမာ− ဝင်ရောက်ရန် စာမျက်နှာသည် ပြသထားသည့် အဖွဲ့အစည်းနှင့် သက်ဆိုင်မှုမရှိခြင်း ဖြစ်နိုင်ပါသည်။"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"မည်သို့ပင်ဖြစ်စေ ဘရောက်ဇာမှတစ်ဆင့် ရှေ့ဆက်ရန်"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"စွမ်းဆောင်ရည် မြှင့်တင်အက်ပ်"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"သင်၏ မိုဘိုင်းဖုန်းကုမ္ပဏီထံမှ 5G ရွေးစရာများ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"သင့်အက်ပ်အသုံးပြုမှုအတွက် ရွေးစရာများကြည့်ရန် %s ၏ ဝဘ်ဆိုက်သို့ ဝင်ကြည့်ပါ"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ယခုမလုပ်ပါ"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"စီမံရန်"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"စွမ်းဆောင်ရည် မြှင့်တင်အက်ပ် ဝယ်ယူရန်။"</string> diff --git a/packages/CarrierDefaultApp/res/values-ne/strings.xml b/packages/CarrierDefaultApp/res/values-ne/strings.xml index 169ceff4a304..9bf2fb104ae9 100644 --- a/packages/CarrierDefaultApp/res/values-ne/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ne/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"सेवा प्रदायकसँग गरिएका कुराकानीहरू"</string> <string name="android_system_label" msgid="2797790869522345065">"मोबाइलको सेवा प्रदायक छनौट गर्नुहोस्"</string> <string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा सकियो"</string> <string name="no_data_notification_id" msgid="668400731803969521">"तपाईंको मोबाइल डेटा निष्क्रिय पारिएको छ"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"उदाहरणका लागि, लग इन पृष्ठ देखाइएको संस्थाको नहुन सक्छ।"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"जे भए पनि ब्राउजर मार्फत जारी राख्नुहोस्"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"पर्फर्मेन्स बुस्ट"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"तपाईंको सेवा प्रदायकले उपलब्ध गराएका 5G सम्बन्धी विकल्पहरू"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"एप प्रयोग गर्दा अझ राम्रो सुविधा पाउन %s को वेबसाइटमा गई विकल्पहरू हेर्नुहोस्"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"अहिले होइन"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"व्यवस्थापन गर्नुहोस्"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"पर्फर्मेन्स बुस्ट किन्नुहोस्।"</string> diff --git a/packages/CarrierDefaultApp/res/values-nl/strings.xml b/packages/CarrierDefaultApp/res/values-nl/strings.xml index 35ecb3cf904a..b2850c0c1537 100644 --- a/packages/CarrierDefaultApp/res/values-nl/strings.xml +++ b/packages/CarrierDefaultApp/res/values-nl/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Berichten van provider"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobiele provider"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobiele data verbruikt"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Je mobiele data zijn uitgeschakeld"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Zo hoort de weergegeven inlogpagina misschien niet bij de weergegeven organisatie."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Toch doorgaan via browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Prestatieboost"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-opties van je provider"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Ga naar de website van %s om opties voor de app-functionaliteit te zien"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Niet nu"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Beheren"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Koop een prestatieboost."</string> diff --git a/packages/CarrierDefaultApp/res/values-or/strings.xml b/packages/CarrierDefaultApp/res/values-or/strings.xml index dc13b65f2e19..884af9ae4ce7 100644 --- a/packages/CarrierDefaultApp/res/values-or/strings.xml +++ b/packages/CarrierDefaultApp/res/values-or/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"କେରିଅର କମ୍ୟୁନିକେସନ୍ସ"</string> <string name="android_system_label" msgid="2797790869522345065">"ମୋବାଇଲ୍ କେରିଅର୍"</string> <string name="portal_notification_id" msgid="5155057562457079297">"ମୋବାଇଲ୍ ଡାଟା ଶେଷ ହୋଇଯାଇଛି"</string> <string name="no_data_notification_id" msgid="668400731803969521">"ଆପଣଙ୍କ ମୋବାଇଲ୍ ଡାଟା ନିଷ୍କ୍ରୀୟ କରାଯାଇଛି"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ଉଦାହରଣସ୍ୱରୂପ, ଲଗଇନ୍ ପୃଷ୍ଠା ଦେଖାଯାଇଥିବା ସଂସ୍ଥାର ହୋଇନଥାଇପାରେ।"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ବ୍ରାଉଜର୍ ଜରିଆରେ ଯେମିତିବି ହେଉ ଜାରି ରଖନ୍ତୁ"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ପରଫରମାନ୍ସ ବୁଷ୍ଟ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"ଆପଣଙ୍କ କେରିଅରରୁ 5G ବିକଳ୍ପଗୁଡ଼ିକ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ଆପଣଙ୍କ ଆପ ଅନୁଭୂତି ପାଇଁ ବିକଳ୍ପ ଦେଖିବାକୁ %sର ୱେବସାଇଟକୁ ଭିଜିଟ କରନ୍ତୁ"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ବର୍ତ୍ତମାନ ନୁହେଁ"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ଏକ ପରଫରମାନ୍ସ ବୁଷ୍ଟ କିଣନ୍ତୁ।"</string> diff --git a/packages/CarrierDefaultApp/res/values-pl/strings.xml b/packages/CarrierDefaultApp/res/values-pl/strings.xml index 3ca001ba12e5..3f499a7828b4 100644 --- a/packages/CarrierDefaultApp/res/values-pl/strings.xml +++ b/packages/CarrierDefaultApp/res/values-pl/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Informacje od operatora"</string> <string name="android_system_label" msgid="2797790869522345065">"Operator komórkowy"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Osiągnięto limit komórkowej transmisji danych"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobilna transmisja danych została wyłączona"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Na przykład strona logowania może nie należeć do wyświetlanej organizacji."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Kontynuuj mimo to w przeglądarce"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Zwiększenie wydajności"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opcje 5G u Twojego operatora"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Opcje dotyczące korzystania z aplikacji znajdziesz na stronie firmy %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Nie teraz"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Zarządzaj"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kup wzmocnienie wydajności"</string> diff --git a/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml b/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml index cb8329c77d2d..cb3bca94ac68 100644 --- a/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml +++ b/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicações da operadora"</string> <string name="android_system_label" msgid="2797790869522345065">"Operadora de celular"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Os dados móveis se esgotaram"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Os dados móveis foram desativados"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Por exemplo, a página de login pode não pertencer à organização mostrada."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar mesmo assim pelo navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Aumento de performance"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opções 5G da sua operadora"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visite o site de %s para conferir opções da sua experiência no app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Agora não"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gerenciar"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Comprar um aumento de performance."</string> diff --git a/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml b/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml index 7e435cff2dd5..137a1c628402 100644 --- a/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml +++ b/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicações do operador"</string> <string name="android_system_label" msgid="2797790869522345065">"Operador móvel"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Dados móveis esgotados"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Os seus dados móveis foram desativados"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Por exemplo, a página de início de sessão pode não pertencer à entidade apresentada."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar mesmo assim através do navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Aumento do desempenho"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opções 5G do seu operador"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visite o Website de %s para ver opções para a experiência da sua app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Agora não"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gerir"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Compre um aumento do desempenho."</string> diff --git a/packages/CarrierDefaultApp/res/values-pt/strings.xml b/packages/CarrierDefaultApp/res/values-pt/strings.xml index cb8329c77d2d..cb3bca94ac68 100644 --- a/packages/CarrierDefaultApp/res/values-pt/strings.xml +++ b/packages/CarrierDefaultApp/res/values-pt/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicações da operadora"</string> <string name="android_system_label" msgid="2797790869522345065">"Operadora de celular"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Os dados móveis se esgotaram"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Os dados móveis foram desativados"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Por exemplo, a página de login pode não pertencer à organização mostrada."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar mesmo assim pelo navegador"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Aumento de performance"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opções 5G da sua operadora"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visite o site de %s para conferir opções da sua experiência no app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Agora não"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gerenciar"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Comprar um aumento de performance."</string> diff --git a/packages/CarrierDefaultApp/res/values-ro/strings.xml b/packages/CarrierDefaultApp/res/values-ro/strings.xml index 042d9ec407af..78b910e074f3 100644 --- a/packages/CarrierDefaultApp/res/values-ro/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ro/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Comunicări de la operator"</string> <string name="android_system_label" msgid="2797790869522345065">"Operator de telefonie mobilă"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Datele mobile au expirat"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Datele mobile au fost dezactivate"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"De exemplu, este posibil ca pagina de conectare să nu aparțină organizației afișate."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Continuă oricum prin browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Boost de performanță"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opțiuni 5G de la operator"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Accesează site-ul %s ca să vezi opțiunile pentru experiența ta cu aplicațiile"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Nu acum"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gestionează"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Achiziționează un boost de performanță."</string> diff --git a/packages/CarrierDefaultApp/res/values-ru/strings.xml b/packages/CarrierDefaultApp/res/values-ru/strings.xml index 0c257967a9bb..936a6faa5fc0 100644 --- a/packages/CarrierDefaultApp/res/values-ru/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ru/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Оператор связи"</string> <string name="android_system_label" msgid="2797790869522345065">"Оператор мобильной связи"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобильный трафик израсходован"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобильный Интернет отключен"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Например, страница входа в аккаунт может быть фиктивной."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Продолжить в браузере"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Повышение производительности"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Сеть 5G от оператора связи"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Посетите сайт оператора (%s), чтобы узнать, как улучшить производительность приложения."</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не сейчас"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Настроить"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Повысьте производительность сети за плату."</string> diff --git a/packages/CarrierDefaultApp/res/values-sk/strings.xml b/packages/CarrierDefaultApp/res/values-sk/strings.xml index e14e0875b89f..77951cf0638b 100644 --- a/packages/CarrierDefaultApp/res/values-sk/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sk/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikácie s operátorom"</string> <string name="android_system_label" msgid="2797790869522345065">"Poskytovateľ mobilných služieb"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobilné dáta sa minuli"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Vaše mobilné dáta boli deaktivované"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Napríklad prihlasovacia stránka nemusí patriť uvedenej organizácii."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Pokračovať pomocou prehliadača"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Zvýšenie výkonu"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Možnosti siete 5G od vášho operátora"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Ak chcete zistiť, aké sú možnosti prostredia v aplikácii, prejdite na web %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Teraz nie"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Spravovať"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kúpte si zvýšenie výkonu."</string> diff --git a/packages/CarrierDefaultApp/res/values-sl/strings.xml b/packages/CarrierDefaultApp/res/values-sl/strings.xml index 21cb9443b819..bee2217895f8 100644 --- a/packages/CarrierDefaultApp/res/values-sl/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sl/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobilni operater"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Porabili ste vse mobilne podatke"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Prenos podatkov v mobilnih omrežjih je deaktiviran"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Stran za prijavo na primer morda ne pripada prikazani organizaciji."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Vseeno nadaljuj v brskalniku"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Ojačevalnik zmogljivosti"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operaterjeve možnosti 5G"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Obiščite spletno mesto %s, da si ogledate možnosti izkušnje aplikacije."</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ne zdaj"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Upravljanje"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kupite ojačevalnik zmogljivosti."</string> diff --git a/packages/CarrierDefaultApp/res/values-sq/strings.xml b/packages/CarrierDefaultApp/res/values-sq/strings.xml index 9d501d958506..238921aaa8f0 100644 --- a/packages/CarrierDefaultApp/res/values-sq/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sq/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Komunikimet e operatorit celular"</string> <string name="android_system_label" msgid="2797790869522345065">"Operatori celular"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Të dhënat celulare kanë përfunduar"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Të dhënat celulare janë çaktivizuar"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"për shembull, faqja e identifikimit mund të mos i përkasë organizatës së shfaqur."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Vazhdo gjithsesi nëpërmjet shfletuesit"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Përforcimi i performancës"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opsionet 5G nga operatori yt celular"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Vizito sajtin e uebit të %s për të parë opsione për përvojën tënde me aplikacionin"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Jo tani"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Menaxho"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Bli një paketë përforcimi të performancës."</string> diff --git a/packages/CarrierDefaultApp/res/values-sr/strings.xml b/packages/CarrierDefaultApp/res/values-sr/strings.xml index 257d53b56fc2..c99431b71840 100644 --- a/packages/CarrierDefaultApp/res/values-sr/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sr/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Обавештења мобилног оператера"</string> <string name="android_system_label" msgid="2797790869522345065">"Мобилни оператер"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Мобилни подаци су потрошени"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Мобилни подаци су деактивирани"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"На пример, страница за пријављивање можда не припада приказаној организацији."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Ипак настави преко прегледача"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Побољшање учинка"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G опције мобилног оператера"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Опције за доживљај апликације потражите на веб-сајту мобилног оператера %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не сада"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Управљај"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Купите побољшање учинка."</string> diff --git a/packages/CarrierDefaultApp/res/values-sv/strings.xml b/packages/CarrierDefaultApp/res/values-sv/strings.xml index 1886ed9dc20f..d2e8d93be0b0 100644 --- a/packages/CarrierDefaultApp/res/values-sv/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sv/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobiloperatör"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Slut på mobildata"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Din mobildata har inaktiverats"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Det kan t.ex. hända att inloggningssidan inte tillhör den organisation som visas."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Fortsätt ändå via webbläsaren"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Prestandahöjning"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-alternativ från operatören"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Se alternativ för appupplevelsen på webbplatsen för %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Inte nu"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Hantera"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Köp en prestandahöjning."</string> diff --git a/packages/CarrierDefaultApp/res/values-sw/strings.xml b/packages/CarrierDefaultApp/res/values-sw/strings.xml index fc3450f8d920..5dc79212b413 100644 --- a/packages/CarrierDefaultApp/res/values-sw/strings.xml +++ b/packages/CarrierDefaultApp/res/values-sw/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Mawasiliano ya Mtoa Huduma"</string> <string name="android_system_label" msgid="2797790869522345065">"Mtoa Huduma za Simu"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Data ya mtandao wa simu imekwisha"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Data yako ya mtandao wa simu imezimwa"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Kwa mfano, ukurasa wa kuingia katika akaunti unaweza usiwe unamilikiwa na shirika lililoonyeshwa."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Endelea hata hivyo kupitia kivinjari"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Kuongeza utendaji"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Chaguo za 5G kutoka kwa mtoa huduma wako"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Tembelea tovuti ya %s ili uone chaguo za hali ya matumizi ya programu yako"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Si sasa"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Dhibiti"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Nunua programu ya kuongeza utendaji."</string> diff --git a/packages/CarrierDefaultApp/res/values-te/strings.xml b/packages/CarrierDefaultApp/res/values-te/strings.xml index 944ee758f228..5f86828afd8b 100644 --- a/packages/CarrierDefaultApp/res/values-te/strings.xml +++ b/packages/CarrierDefaultApp/res/values-te/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"క్యారియర్ కమ్యూనికేషన్లు"</string> <string name="android_system_label" msgid="2797790869522345065">"మొబైల్ క్యారియర్"</string> <string name="portal_notification_id" msgid="5155057562457079297">"మొబైల్ డేటాను పూర్తిగా ఉపయోగించారు"</string> <string name="no_data_notification_id" msgid="668400731803969521">"మీ మొబైల్ డేటా నిష్క్రియం చేయబడింది"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ఉదాహరణకు, లాగిన్ పేజీ చూపిన సంస్థకు చెందినది కాకపోవచ్చు."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ఏదేమైనా బ్రౌజర్ ద్వారా కొనసాగించండి"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"పనితీరు బూస్ట్"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"మీ క్యారియర్ నుండి 5G ఆప్షన్లు"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"మీ యాప్ అనుభవం కోసం ఆప్షన్లను చూడటానికి %s వెబ్సైట్కు వెళ్లండి"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ఇప్పుడు కాదు"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"మేనేజ్ చేయండి"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"పనితీరు బూస్ట్ను కొనుగోలు చేయండి."</string> diff --git a/packages/CarrierDefaultApp/res/values-th/strings.xml b/packages/CarrierDefaultApp/res/values-th/strings.xml index e13ce44390a5..586ffd5a7421 100644 --- a/packages/CarrierDefaultApp/res/values-th/strings.xml +++ b/packages/CarrierDefaultApp/res/values-th/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"การสื่อสารจากผู้ให้บริการ"</string> <string name="android_system_label" msgid="2797790869522345065">"ผู้ให้บริการเครือข่ายมือถือ"</string> <string name="portal_notification_id" msgid="5155057562457079297">"เน็ตมือถือหมดแล้ว"</string> <string name="no_data_notification_id" msgid="668400731803969521">"อินเทอร์เน็ตมือถือของคุณถูกปิดใช้งานแล้ว"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"ตัวอย่างเช่น หน้าเข้าสู่ระบบอาจไม่ใช่ขององค์กรที่แสดงไว้"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"ดำเนินการต่อผ่านเบราว์เซอร์"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"การเพิ่มประสิทธิภาพ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"ตัวเลือก 5G จากผู้ให้บริการ"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"ดูตัวเลือกต่างๆ สำหรับประสบการณ์การใช้งานแอปได้ที่เว็บไซต์ของ %s"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ไว้ทีหลัง"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"จัดการ"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"ซื้อการเพิ่มประสิทธิภาพ"</string> diff --git a/packages/CarrierDefaultApp/res/values-tl/strings.xml b/packages/CarrierDefaultApp/res/values-tl/strings.xml index bdb09ac4dc59..a311a25199c9 100644 --- a/packages/CarrierDefaultApp/res/values-tl/strings.xml +++ b/packages/CarrierDefaultApp/res/values-tl/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Mga Pakikipag-ugnayan sa Carrier"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobile Carrier"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Naubos na ang mobile data"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Na-deactivate na ang iyong mobile data"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Halimbawa, maaaring hindi pag-aari ng ipinapakitang organisasyon ang page ng login."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Magpatuloy pa rin sa pamamagitan ng browser"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Pag-boost ng performance"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Mga opsyon sa 5G mula sa carrier mo"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Pumunta sa website ng %s para tingnan ang mga opsyon para sa iyong experience sa app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Huwag muna"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Pamahalaan"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Bumili ng pang-boost ng performance."</string> diff --git a/packages/CarrierDefaultApp/res/values-ur/strings.xml b/packages/CarrierDefaultApp/res/values-ur/strings.xml index ef2677f4424d..0c7cdc5b912b 100644 --- a/packages/CarrierDefaultApp/res/values-ur/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ur/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"کیریئر سے متعلق مواصلات"</string> <string name="android_system_label" msgid="2797790869522345065">"موبائل کیریئر"</string> <string name="portal_notification_id" msgid="5155057562457079297">"موبائل ڈیٹا ختم ہو چکا ہے"</string> <string name="no_data_notification_id" msgid="668400731803969521">"آپ کا موبائل ڈیٹا غیر فعال کر دیا گیا ہے"</string> @@ -16,8 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"مثال کے طور پر ہو سکتا ہے کہ لاگ ان صفحہ دکھائی گئی تنظیم سے تعلق نہ رکھتا ہو۔"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"براؤزر کے ذریعے بہرحال جاری رکھیں"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"پرفارمینس بوسٹ"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"آپ کے کیریئر سے 5G کے اختیارات"</string> + <!-- String.format failed for translation --> <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> <skip /> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ابھی نہیں"</string> diff --git a/packages/CarrierDefaultApp/res/values-uz/strings.xml b/packages/CarrierDefaultApp/res/values-uz/strings.xml index dd489754e0d0..0f25e7ec789d 100644 --- a/packages/CarrierDefaultApp/res/values-uz/strings.xml +++ b/packages/CarrierDefaultApp/res/values-uz/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Operator aloqasi"</string> <string name="android_system_label" msgid="2797790869522345065">"Mobil aloqa operatori"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Mobil internet tugab qoldi"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Mobil internet o‘chirildi"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Masalan, tizimga kirish sahifasi ko‘rsatilgan tashkilotga tegishli bo‘lmasligi mumkin."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Brauzerda davom ettirish"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Unumdorlikni kuchaytirish"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operatordan 5G aloqa parametrlari"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Ilovadan foydalanish usullarini koʻrish uchun %s saytini oching"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Hozir emas"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Boshqarish"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Unumdorlikni kuchaytirish xizmatini xarid qiling."</string> diff --git a/packages/CarrierDefaultApp/res/values-vi/strings.xml b/packages/CarrierDefaultApp/res/values-vi/strings.xml index b01f95110490..d99aa22ad002 100644 --- a/packages/CarrierDefaultApp/res/values-vi/strings.xml +++ b/packages/CarrierDefaultApp/res/values-vi/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Nhà cung cấp dịch vụ truyền thông"</string> <string name="android_system_label" msgid="2797790869522345065">"Nhà cung cấp dịch vụ di động"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Dữ liệu di động đã hết"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Dữ liệu di động của bạn đã bị hủy kích hoạt"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Ví dụ: trang đăng nhập có thể không thuộc về tổ chức được hiển thị."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Vẫn tiếp tục qua trình duyệt"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Tăng hiệu suất"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Tuỳ chọn 5G từ nhà mạng của bạn"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Truy cập trang web của %s để xem các lựa chọn cho trải nghiệm trên ứng dụng"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Để sau"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Quản lý"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Mua gói tăng hiệu suất."</string> diff --git a/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml index e06cddb8797e..b05835deaf65 100644 --- a/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml +++ b/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"运营商通信"</string> <string name="android_system_label" msgid="2797790869522345065">"移动运营商"</string> <string name="portal_notification_id" msgid="5155057562457079297">"移动数据流量已用尽"</string> <string name="no_data_notification_id" msgid="668400731803969521">"您的移动数据网络已停用"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"例如,登录页面可能并不属于页面上显示的单位。"</string> <string name="ssl_error_continue" msgid="1138548463994095584">"仍然通过浏览器继续操作"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"性能提升方案"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"您的运营商提供的 5G 选项"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"访问%s的网站可查看您的应用体验选项"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"以后再说"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"管理"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"购买一份性能提升方案。"</string> diff --git a/packages/CarrierDefaultApp/res/values-zu/strings.xml b/packages/CarrierDefaultApp/res/values-zu/strings.xml index dc09c9d5ebb1..e624a193ab95 100644 --- a/packages/CarrierDefaultApp/res/values-zu/strings.xml +++ b/packages/CarrierDefaultApp/res/values-zu/strings.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_name (2809080280462257271) --> - <skip /> + <string name="app_name" msgid="2809080280462257271">"Inkampani Yezokuxhumana"</string> <string name="android_system_label" msgid="2797790869522345065">"Inkampini yenethiwekhi yeselula"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Idatha yeselula iphelile"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Idatha yakho yeselula yenziwe yangasebenzi"</string> @@ -16,10 +15,8 @@ <string name="ssl_error_example" msgid="6188711843183058764">"Isibonelo, ikhasi lokungena ngemvume kungenzeka lingelenhlangano ebonisiwe."</string> <string name="ssl_error_continue" msgid="1138548463994095584">"Qhubeka noma kunjalo ngesiphequluli"</string> <string name="performance_boost_notification_channel" msgid="3475440855635538592">"I-boost yokusebenza"</string> - <!-- no translation found for performance_boost_notification_title (3126203390685781861) --> - <skip /> - <!-- no translation found for performance_boost_notification_detail (216569851036236346) --> - <skip /> + <string name="performance_boost_notification_title" msgid="3126203390685781861">"Okukhethwa kukho kwe-5G okuvela kunkampani yakho yenethiwekhi"</string> + <string name="performance_boost_notification_detail" msgid="216569851036236346">"Vakashela iwebhusayithi ye-%s ukuze ubone okukhethwa kukho kolwazi lwakho lwe-app"</string> <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Hhayi manje"</string> <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Phatha"</string> <string name="slice_purchase_app_label" msgid="7170191659233241166">"Thenga i-boost yokusebenza."</string> diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml index f655d6b174d5..1d069b69f061 100644 --- a/packages/CredentialManager/res/values/strings.xml +++ b/packages/CredentialManager/res/values/strings.xml @@ -129,4 +129,6 @@ <string name="get_dialog_heading_from_another_device">From another device</string> <!-- This is a label for a button that takes the user to other available devices. [CHAR LIMIT=120] --> <string name="get_dialog_option_headline_use_a_different_device">Use a different device</string> + <!-- Text shown on a snackbar when the app cancelled the UI. [CHAR LIMIT=120] --> + <string name="request_cancelled_by">Request cancelled by <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string> </resources>
\ No newline at end of file diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt index b5c8989de618..b3d3b6dc66d0 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt @@ -29,7 +29,6 @@ import android.credentials.ui.Entry import android.credentials.ui.GetCredentialProviderData import android.credentials.ui.RequestInfo import android.graphics.drawable.Drawable -import android.service.credentials.CredentialEntry import android.text.TextUtils import android.util.Log import com.android.credentialmanager.common.Constants @@ -57,6 +56,7 @@ import androidx.credentials.PublicKeyCredential.Companion.TYPE_PUBLIC_KEY_CREDEN import androidx.credentials.provider.Action import androidx.credentials.provider.AuthenticationAction import androidx.credentials.provider.CreateEntry +import androidx.credentials.provider.CredentialEntry import androidx.credentials.provider.CustomCredentialEntry import androidx.credentials.provider.PasswordCredentialEntry import androidx.credentials.provider.PublicKeyCredentialEntry @@ -232,6 +232,13 @@ class GetFlowUtils { )) } is PublicKeyCredentialEntry -> { + val passkeyUsername = credentialEntry.username.toString() + val passkeyDisplayName = credentialEntry.displayName?.toString() ?: "" + val (username, displayName) = userAndDisplayNameForPasskey( + passkeyUsername = passkeyUsername, + passkeyDisplayName = passkeyDisplayName, + ) + result.add(CredentialEntryInfo( providerId = providerId, providerDisplayName = providerLabel, @@ -241,8 +248,8 @@ class GetFlowUtils { fillInIntent = it.frameworkExtrasIntent, credentialType = CredentialType.PASSKEY, credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(), - userName = credentialEntry.username.toString(), - displayName = credentialEntry.displayName?.toString(), + userName = username, + displayName = displayName, icon = credentialEntry.icon.loadDrawable(context), shouldTintIcon = credentialEntry.isDefaultIcon, lastUsedTimeMillis = credentialEntry.lastUsedTime, @@ -646,16 +653,20 @@ class CreateFlowUtils { preferImmediatelyAvailableCredentials: Boolean, ): RequestDisplayInfo? { val json = JSONObject(requestJson) - var name = "" - var displayName = "" + var passkeyUsername = "" + var passkeyDisplayName = "" if (json.has("user")) { val user: JSONObject = json.getJSONObject("user") - name = user.getString("name") - displayName = user.getString("displayName") + passkeyUsername = user.getString("name") + passkeyDisplayName = user.getString("displayName") } + val (username, displayname) = userAndDisplayNameForPasskey( + passkeyUsername = passkeyUsername, + passkeyDisplayName = passkeyDisplayName, + ) return RequestDisplayInfo( - name, - displayName, + username, + displayname, CredentialType.PASSKEY, appLabel, context.getDrawable(R.drawable.ic_passkey_24) ?: return null, @@ -664,3 +675,30 @@ class CreateFlowUtils { } } } + +/** + * Returns the actual username and display name for the UI display purpose for the passkey use case. + * + * Passkey has some special requirements: + * 1) display-name on top (turned into UI username) if one is available, username on second line. + * 2) username on top if display-name is not available. + * 3) don't show username on second line if username == display-name + */ +private fun userAndDisplayNameForPasskey( + passkeyUsername: String, + passkeyDisplayName: String, +): Pair<String, String> { + if (!TextUtils.isEmpty(passkeyUsername) && !TextUtils.isEmpty(passkeyDisplayName)) { + if (passkeyUsername == passkeyDisplayName) { + return Pair(passkeyUsername, "") + } else { + return Pair(passkeyDisplayName, passkeyUsername) + } + } else if (!TextUtils.isEmpty(passkeyUsername)) { + return Pair(passkeyUsername, passkeyDisplayName) + } else if (!TextUtils.isEmpty(passkeyDisplayName)) { + return Pair(passkeyDisplayName, passkeyUsername) + } else { + return Pair(passkeyDisplayName, passkeyUsername) + } +} diff --git a/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt b/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt index 26aadd9d5dee..1f99500a3ea7 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt @@ -84,7 +84,7 @@ class GetTestUtils { return Entry( key, subkey, - RemoteEntry(pendingIntent).slice + RemoteEntry.toSlice(RemoteEntry(pendingIntent)) ) } @@ -219,12 +219,16 @@ class CreateTestUtils { key, subkey, CreateEntry.toSlice( - providerUserDisplayName, - null, - footerDescription, - lastUsedTime, - credCountMap, - pendingIntent + CreateEntry( + accountName = providerUserDisplayName, + pendingIntent = pendingIntent, + description = footerDescription, + lastUsedTime = lastUsedTime, + icon = null, + passwordCredentialCount = passwordCount, + publicKeyCredentialCount = passkeyCount, + totalCredentialCount = totalCredentialCount, + ) ), Intent() ) @@ -241,7 +245,7 @@ class CreateTestUtils { return Entry( key, subkey, - RemoteEntry(pendingIntent).slice + RemoteEntry.toSlice(RemoteEntry(pendingIntent)) ) } } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Entry.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Entry.kt index bba08f4d787f..7a720b1e858b 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Entry.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Entry.kt @@ -43,14 +43,18 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.composed import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import com.android.credentialmanager.R import com.android.credentialmanager.ui.theme.EntryShape @@ -336,7 +340,7 @@ fun MoreOptionTopAppBar( contentDescription = stringResource( R.string.accessibility_back_arrow_button ), - modifier = Modifier.size(24.dp), + modifier = Modifier.size(24.dp).autoMirrored(), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -345,4 +349,11 @@ fun MoreOptionTopAppBar( colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent), modifier = Modifier.padding(top = 12.dp, bottom = bottomPadding) ) +} + +private fun Modifier.autoMirrored() = composed { + when (LocalLayoutDirection.current) { + LayoutDirection.Rtl -> graphicsLayer(scaleX = -1f) + else -> this + } }
\ No newline at end of file diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt index 56324581c020..c27ac943bca7 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt @@ -59,6 +59,8 @@ import com.android.credentialmanager.common.ui.SheetContainerCard import com.android.credentialmanager.common.ui.SnackbarActionText import com.android.credentialmanager.common.ui.HeadlineText import com.android.credentialmanager.common.ui.CredentialListSectionHeader +import com.android.credentialmanager.common.ui.HeadlineIcon +import com.android.credentialmanager.common.ui.LargeLabelTextOnSurfaceVariant import com.android.credentialmanager.common.ui.Snackbar import com.android.credentialmanager.common.ui.setTransparentSystemBarsColor import com.android.credentialmanager.common.ui.setBottomSheetSystemBarsColor @@ -167,22 +169,42 @@ fun PrimarySelectionCard( providerDisplayInfo.sortedUserNameToCredentialEntryList val authenticationEntryList = providerDisplayInfo.authenticationEntryList SheetContainerCard { + // When only one provider (not counting the remote-only provider) exists, display that + // provider's icon + name up top. + if (providerInfoList.size <= 2) { // It's only possible to be the single provider case + // if we are started with no more than 2 providers. + val nonRemoteProviderList = providerInfoList.filter( + { it.credentialEntryList.isNotEmpty() || it.authenticationEntryList.isNotEmpty() } + ) + if (nonRemoteProviderList.size == 1) { + val providerInfo = nonRemoteProviderList.firstOrNull() // First should always work + // but just to be safe. + if (providerInfo != null) { + item { + HeadlineIcon( + bitmap = providerInfo.icon.toBitmap().asImageBitmap(), + tint = Color.Unspecified, + ) + } + item { Divider(thickness = 4.dp, color = Color.Transparent) } + item { LargeLabelTextOnSurfaceVariant(text = providerInfo.displayName) } + item { Divider(thickness = 16.dp, color = Color.Transparent) } + } + } + } + + val hasSingleEntry = (sortedUserNameToCredentialEntryList.size == 1 && + authenticationEntryList.isEmpty()) || (sortedUserNameToCredentialEntryList.isEmpty() && + authenticationEntryList.size == 1) item { HeadlineText( text = stringResource( - if (sortedUserNameToCredentialEntryList - .size == 1 && authenticationEntryList.isEmpty() - ) { - if (sortedUserNameToCredentialEntryList.first() - .sortedCredentialEntryList.first().credentialType + if (hasSingleEntry) { + if (sortedUserNameToCredentialEntryList.firstOrNull() + ?.sortedCredentialEntryList?.first()?.credentialType == CredentialType.PASSKEY ) R.string.get_dialog_title_use_passkey_for else R.string.get_dialog_title_use_sign_in_for - } else if ( - sortedUserNameToCredentialEntryList - .isEmpty() && authenticationEntryList.size == 1 - ) { - R.string.get_dialog_title_use_sign_in_for } else R.string.get_dialog_title_choose_sign_in_for, requestDisplayInfo.appName ), diff --git a/packages/CtsShim/Android.bp b/packages/CtsShim/Android.bp index 31cd76079131..baafe7ba570c 100644 --- a/packages/CtsShim/Android.bp +++ b/packages/CtsShim/Android.bp @@ -44,6 +44,9 @@ android_app_import { arm64: { apk: "apk/arm/CtsShimPriv.apk", }, + riscv64: { + apk: "apk/riscv64/CtsShimPriv.apk", + }, x86: { apk: "apk/x86/CtsShimPriv.apk", }, @@ -82,6 +85,9 @@ android_app_import { arm64: { apk: "apk/arm/CtsShim.apk", }, + riscv64: { + apk: "apk/riscv64/CtsShim.apk", + }, x86: { apk: "apk/x86/CtsShim.apk", }, diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk Binary files differindex fb092862b79e..af306a504d30 100644 --- a/packages/CtsShim/apk/arm/CtsShim.apk +++ b/packages/CtsShim/apk/arm/CtsShim.apk diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk Binary files differindex 07915ce76bb5..98c535127e7e 100644 --- a/packages/CtsShim/apk/arm/CtsShimPriv.apk +++ b/packages/CtsShim/apk/arm/CtsShimPriv.apk diff --git a/packages/CtsShim/apk/riscv64/CtsShim.apk b/packages/CtsShim/apk/riscv64/CtsShim.apk Binary files differnew file mode 100644 index 000000000000..af306a504d30 --- /dev/null +++ b/packages/CtsShim/apk/riscv64/CtsShim.apk diff --git a/packages/CtsShim/apk/riscv64/CtsShimPriv.apk b/packages/CtsShim/apk/riscv64/CtsShimPriv.apk Binary files differnew file mode 100644 index 000000000000..9a9997dc4155 --- /dev/null +++ b/packages/CtsShim/apk/riscv64/CtsShimPriv.apk diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk Binary files differindex fb092862b79e..af306a504d30 100644 --- a/packages/CtsShim/apk/x86/CtsShim.apk +++ b/packages/CtsShim/apk/x86/CtsShim.apk diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk Binary files differindex 20e94b6f2dac..29ad4786e3c7 100644 --- a/packages/CtsShim/apk/x86/CtsShimPriv.apk +++ b/packages/CtsShim/apk/x86/CtsShimPriv.apk diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java index 55626844594d..2c4b4786c968 100644 --- a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java +++ b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java @@ -422,7 +422,7 @@ public class DynamicSystemInstallationService extends Service Log.e(TAG, "Failed to disable DynamicSystem."); // Dismiss status bar and show a toast. - sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + closeSystemDialogs(); Toast.makeText(this, getString(R.string.toast_failed_to_disable_dynsystem), Toast.LENGTH_LONG).show(); diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index 72fb5d6c09ae..5f0e3c2e69f4 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Hierdie gebruiker kan nie onbekende programme installeer nie"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Hierdie gebruiker word nie toegelaat om programme te installeer nie"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Bestuur programme"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Geen spasie oor nie"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kon nie geïnstalleer word nie. Maak spasie beskikbaar en probeer weer."</string> diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml index 378770d86f86..e2a25b3b4baa 100644 --- a/packages/PackageInstaller/res/values-am/strings.xml +++ b/packages/PackageInstaller/res/values-am/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ይህን መተግበሪያ ማዘመን ይፈልጋሉ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ያልታወቁ መተግበሪያዎች በዚህ ተጠቃሚ ሊጫኑ አይችሉም"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ይህ ተጠቃሚ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም"</string> <string name="ok" msgid="7871959885003339302">"እሺ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"መተግበሪያዎችን ያቀናብሩ"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ቦታ ሞልቷል"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>ን መጫን አልቻለም። የተወሰነ ቦታ ያስለቅቁና እንደገና ይሞክሩ።"</string> diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index f9df296f8356..5c974b0e8e3b 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string> <string name="install_confirm_question" msgid="7663733664476363311">"هل تريد تثبيت هذا التطبيق؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"هل تريد تحديث هذا التطبيق؟"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"يتعذر على هذا المستخدم تثبيت التطبيقات غير المعروفة"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"غير مسموح لهذا المستخدم بتثبيت التطبيقات"</string> <string name="ok" msgid="7871959885003339302">"حسنًا"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"إدارة التطبيقات"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"نفدت مساحة التخزين"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"تعذر تثبيت <xliff:g id="APP_NAME">%1$s</xliff:g> الرجاء تحرير بعض المساحة والمحاولة مرة أخرى."</string> diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index 2b41b1e84dc0..5997f2da1d09 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপুনি এই এপ্টো ইনষ্টল কৰিবলৈ বিচাৰেনে?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপুনি এই এপ্টো আপডে’ট কৰিবলৈ বিচাৰেনে?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"এপ্টো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"এই ব্যৱহাৰকাৰীয়ে অজ্ঞাত উৎসৰপৰা পোৱা এপসমূহ ইনষ্টল কৰিব নোৱাৰে"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"এই ব্যৱহাৰকাৰীজনৰ এপ্ ইনষ্টল কৰাৰ অনুমতি নাই"</string> <string name="ok" msgid="7871959885003339302">"ঠিক আছে"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"এপ্ পৰিচালনা"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"খালী ঠাই নাই"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ইনষ্টল কৰিব পৰা নগ\'ল। কিছু খালী ঠাই উলিয়াই আকৌ চেষ্টা কৰক৷"</string> diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml index 9e915e349766..0fb5005f3d8c 100644 --- a/packages/PackageInstaller/res/values-az/strings.xml +++ b/packages/PackageInstaller/res/values-az/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu tətbiqi güncəlləmək istəyirsiniz?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Naməlum tətbiqlər bu istifadəçi tərəfindən quraşdırıla bilməz"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu istifadəçinin tətbiqi quraşdırmaq üçün icazəsi yoxdur"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Tətbiqi idarə edin"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Boş yer yoxdur"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> quraşdırıla bilməz. Yaddaş üçün yer boşaldıb yenidən təkrar edin."</string> diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 0a81ac600652..f89266ca2694 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite da instalirate ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite da ažurirate ovu aplikaciju?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može da instalira nepoznate aplikacije"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovom korisniku nije dozvoljeno da instalira aplikacije"</string> <string name="ok" msgid="7871959885003339302">"Potvrdi"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Upravljajte apl."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nema više prostora"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Nismo uspeli da instaliramo aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>. Oslobodite prostor i probajte ponovo."</string> diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml index e828c3c9d420..369a60c04b38 100644 --- a/packages/PackageInstaller/res/values-be/strings.xml +++ b/packages/PackageInstaller/res/values-be/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Усталяваць гэту праграму?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Абнавіць гэту праграму?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Гэты карыстальнік не можа ўсталёўваць невядомыя праграмы"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Гэты карыстальнік не можа ўсталёўваць праграмы"</string> <string name="ok" msgid="7871959885003339302">"ОК"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Кіраваць"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Не хапае месца"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Не ўдалося ўсталяваць праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\". Вызваліце месца і паўтарыце спробу."</string> diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml index 110860b1f754..8263fe13bab3 100644 --- a/packages/PackageInstaller/res/values-bg/strings.xml +++ b/packages/PackageInstaller/res/values-bg/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Искате ли да инсталирате това приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Искате ли да актуализирате това приложение?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Този потребител не може да инсталира неизвестни приложения"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Този потребител няма разрешение да инсталира приложения"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Прил.: Управл."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Няма място"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можа да се инсталира. Освободете място и опитайте отново."</string> diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml index e7aed0b3e007..0d15a7e707e6 100644 --- a/packages/PackageInstaller/res/values-bn/strings.xml +++ b/packages/PackageInstaller/res/values-bn/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপনি কি এই অ্যাপটি ইনস্টল করতে চান?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপনি কি এই অ্যাপটি আপডেট করতে চান?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"এই ব্যবহারকারী অজানা অ্যাপ ইনস্টল করতে পারেন না"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"এই ব্যবহারকারীর অ্যাপ ইনস্টল করার অনুমতি নেই"</string> <string name="ok" msgid="7871959885003339302">"ঠিক আছে"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"অ্যাপ পরিচালনা"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"জায়গা খালি নেই"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ইনস্টল করা যায়নি। কিছু পরিমাণ জায়গা খালি করে আবার চেষ্টা করুন।"</string> diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml index 10ed009ac973..8b197694329e 100644 --- a/packages/PackageInstaller/res/values-bs/strings.xml +++ b/packages/PackageInstaller/res/values-bs/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može instalirati nepoznate aplikacije"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovom korisniku nije dozvoljeno instaliranje aplikacija"</string> <string name="ok" msgid="7871959885003339302">"Uredu"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Uprav. aplik."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatak prostora"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ne možete instalirati aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>. Oslobodite prostor u pohrani i pokušajte ponovo."</string> diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 337e6d9682a8..d025b9a88108 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vols instal·lar aquesta aplicació?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vols actualitzar aquesta aplicació?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aquest usuari no pot instal·lar aplicacions desconegudes"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Aquest usuari no té permís per instal·lar aplicacions"</string> <string name="ok" msgid="7871959885003339302">"D\'acord"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gestiona apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Espai esgotat"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No s\'ha pogut instal·lar <xliff:g id="APP_NAME">%1$s</xliff:g>. Allibera espai i torna-ho a provar."</string> diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml index 33ec41c1928d..5799e72a4aae 100644 --- a/packages/PackageInstaller/res/values-cs/strings.xml +++ b/packages/PackageInstaller/res/values-cs/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete tuto aplikaci nainstalovat?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete tuto aplikaci aktualizovat?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tento uživatel nemůže instalovat neznámé aplikace"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tento uživatel nesmí instalovat aplikace"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Správa aplikací"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatek místa"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> nelze nainstalovat. Uvolněte místo v paměti a zkuste to znovu."</string> diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml index 657eccb869ca..d312de2277ea 100644 --- a/packages/PackageInstaller/res/values-da/strings.xml +++ b/packages/PackageInstaller/res/values-da/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du opdatere denne app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Denne bruger kan ikke installere ukendte apps"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Denne bruger har ikke tilladelse til at installere apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Administrer apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Der er ikke mere plads"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kunne ikke installeres. Frigør noget plads, og prøv igen."</string> diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml index 66e1e59c9105..1332c940eca2 100644 --- a/packages/PackageInstaller/res/values-de/strings.xml +++ b/packages/PackageInstaller/res/values-de/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Möchtest du diese App installieren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Möchtest du diese App aktualisieren?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Dieser Nutzer darf keine unbekannten Apps installieren"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Dieser Nutzer darf keine Apps installieren"</string> <string name="ok" msgid="7871959885003339302">"Ok"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Apps verwalten"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kein freier Speicher vorhanden"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> konnte nicht installiert werden. Gib Speicherplatz frei und versuche es noch einmal."</string> diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml index ec0cfc7a4d76..8b092d75691e 100644 --- a/packages/PackageInstaller/res/values-el/strings.xml +++ b/packages/PackageInstaller/res/values-el/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Θέλετε να ενημερώσετε αυτήν την εφαρμογή;"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Δεν είναι δυνατή η εγκατάσταση άγνωστων εφαρμογών από αυτόν τον χρήστη"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Δεν επιτρέπεται η εγκατάσταση εφαρμογών σε αυτόν τον χρήστη"</string> <string name="ok" msgid="7871959885003339302">"ΟΚ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Διαχ. εφαρμογών"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Δεν υπάρχει χώρος"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Δεν ήταν δυνατή η εγκατάσταση της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g>. Απελευθερώστε λίγο χώρο και προσπαθήστε ξανά."</string> diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml index b718868f2e28..bb05ec43fd40 100644 --- a/packages/PackageInstaller/res/values-en-rAU/strings.xml +++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string> diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml index 03f24c96747c..f2457f26f870 100644 --- a/packages/PackageInstaller/res/values-en-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml @@ -26,6 +26,7 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> + <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -41,6 +42,7 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <string name="update_anyway" msgid="8792432341346261969">"Update anyway"</string> <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string> diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml index b718868f2e28..bb05ec43fd40 100644 --- a/packages/PackageInstaller/res/values-en-rGB/strings.xml +++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string> diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml index b718868f2e28..bb05ec43fd40 100644 --- a/packages/PackageInstaller/res/values-en-rIN/strings.xml +++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string> diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml index a095216e2272..a674c20fa078 100644 --- a/packages/PackageInstaller/res/values-en-rXC/strings.xml +++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml @@ -26,6 +26,7 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> + <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -41,6 +42,7 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <string name="update_anyway" msgid="8792432341346261969">"Update anyway"</string> <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string> diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml index 1d7b8c1410f7..12812ae9b35d 100644 --- a/packages/PackageInstaller/res/values-es-rUS/strings.xml +++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Deseas instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Deseas actualizar esta app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario no puede instalar apps desconocidas"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario no puede instalar apps"</string> <string name="ok" msgid="7871959885003339302">"Aceptar"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gestionar apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sin espacio"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No se pudo instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espacio y vuelve a intentarlo."</string> diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index 482ccf6dcf54..b6714d3bb515 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplicación instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Quieres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Quieres actualizar esta aplicación?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario no puede instalar aplicaciones desconocidas"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario no tiene permiso para instalar aplicaciones"</string> <string name="ok" msgid="7871959885003339302">"Aceptar"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gestionar aplicaciones"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sin espacio"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No se ha podido instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espacio y vuelve a intentarlo."</string> diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml index d5b5316ed9f9..c4a3d05fa15d 100644 --- a/packages/PackageInstaller/res/values-et/strings.xml +++ b/packages/PackageInstaller/res/values-et/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Kas soovite selle rakenduse installida?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Kas soovite seda rakendust värskendada?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"See kasutaja ei saa installida tundmatuid rakendusi"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Kasutajal ei ole lubatud rakendusi installida"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Rakend. haldam."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Pole ruumi"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Rakendust <xliff:g id="APP_NAME">%1$s</xliff:g> ei saanud installida. Vabastage ruumi ja proovige uuesti."</string> diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index 2ca439700f38..97339dcd9d62 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Aplikazioa instalatu nahi duzu?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Aplikazioa eguneratu nahi duzu?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Erabiltzaile honek ezin ditu instalatu aplikazio ezezagunak"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Erabiltzaile honek ez du baimenik aplikazioak instalatzeko"</string> <string name="ok" msgid="7871959885003339302">"Ados"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Kudeatu aplikazioak"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Ez dago behar adina toki"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ezin izan da instalatu <xliff:g id="APP_NAME">%1$s</xliff:g>. Egin toki pixka bat eta saiatu berriro."</string> diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml index e9775ce41da1..65b3241e1783 100644 --- a/packages/PackageInstaller/res/values-fa/strings.xml +++ b/packages/PackageInstaller/res/values-fa/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string> <string name="install_confirm_question" msgid="7663733664476363311">"میخواهید این برنامه را نصب کنید؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"میخواهید این برنامه را بهروزرسانی کنید؟"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"این کاربر نمیتواند برنامههای ناشناس نصب کند"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"این کاربر مجاز به نصب برنامه نیست"</string> <string name="ok" msgid="7871959885003339302">"بسیار خوب"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"مدیریت برنامهها"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"فضا کافی نیست"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> نصب نمیشود. مقداری از فضا را آزاد و دوباره امتحان کنید."</string> diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml index 058633b4638a..a4306ae79527 100644 --- a/packages/PackageInstaller/res/values-fi/strings.xml +++ b/packages/PackageInstaller/res/values-fi/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Haluatko asentaa tämän sovelluksen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Haluatko päivittää tämän sovelluksen?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tämä käyttäjä ei voi asentaa tuntemattomia sovelluksia."</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tämä käyttäjä ei voi asentaa sovelluksia."</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Sovellusvalinnat"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Tallennustila ei riitä"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Sovelluksen <xliff:g id="APP_NAME">%1$s</xliff:g> asentaminen epäonnistui. Vapauta tallennustilaa ja yritä uudelleen."</string> diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml index 2c5a04d063ff..24efdd70bc39 100644 --- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette application?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette application?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Cet utilisateur ne peut pas installer d\'applications inconnues"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Cet utilisateur n\'est pas autorisé à installer des applications"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gérer les applis"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Espace insuffisant"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossible d\'installer <xliff:g id="APP_NAME">%1$s</xliff:g>. Veuillez libérer de l\'espace, puis réessayer."</string> diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml index 032499dd103b..f3afb9012443 100644 --- a/packages/PackageInstaller/res/values-fr/strings.xml +++ b/packages/PackageInstaller/res/values-fr/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette appli ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette appli ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Cet utilisateur ne peut pas installer d\'applications inconnues"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Cet utilisateur n\'est pas autorisé à installer des applications"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gérer applis"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Mémoire insuffisante"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossible d\'installer l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>. Veuillez libérer de l\'espace et réessayer."</string> diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml index 6a37d7b04070..5763bf17071d 100644 --- a/packages/PackageInstaller/res/values-gl/strings.xml +++ b/packages/PackageInstaller/res/values-gl/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Queres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Queres actualizar esta aplicación?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario non pode instalar aplicacións descoñecidas"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario non ten permiso para instalar aplicacións"</string> <string name="ok" msgid="7871959885003339302">"Aceptar"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Xestionar apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Esgotouse o espazo"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Non se puido instalar a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espazo e téntao de novo."</string> diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml index 863c1aa0623a..b3160e24dd3f 100644 --- a/packages/PackageInstaller/res/values-gu/strings.xml +++ b/packages/PackageInstaller/res/values-gu/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string> <string name="install_confirm_question" msgid="7663733664476363311">"શું તમે આ ઍપ ઇન્સ્ટૉલ કરવા માગો છો?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"શું તમે આ ઍપ અપડેટ કરવા માગો છો?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"આ વપરાશકર્તા અજાણી ઍપ્લિકેશનોને ઇન્સ્ટૉલ કરી શકતા નથી"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"આ વપરાશકર્તાને ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી"</string> <string name="ok" msgid="7871959885003339302">"ઓકે"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ઍપને મેનેજ કરો"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"સ્પેસ નથી"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ઇન્સ્ટૉલ કરી શકાઈ નથી. થોડું સ્પેસ ખાલી કરો અને ફરીથી પ્રયાસ કરો."</string> diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml index 3339d35d0c1e..63ee8378f3ac 100644 --- a/packages/PackageInstaller/res/values-hi/strings.xml +++ b/packages/PackageInstaller/res/values-hi/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string> <string name="install_confirm_question" msgid="7663733664476363311">"क्या आपको यह ऐप्लिकेशन इंस्टॉल करना है?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"क्या आप इस ऐप्लिकेशन को अपडेट करना चाहते हैं?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यह उपयोगकर्ता अनजान ऐप्लिकेशन इंस्टॉल नहीं कर सकता"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"इस उपयोगकर्ता को ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है"</string> <string name="ok" msgid="7871959885003339302">"ठीक है"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ऐप्लिकेशन प्रबंधित करें"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"जगह नहीं है"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> को इंस्टॉल नहीं किया जा सका. थोड़ी जगह खाली करें और फिर से कोशिश करें."</string> diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml index 88fdbb773987..2372754cc9d8 100644 --- a/packages/PackageInstaller/res/values-hr/strings.xml +++ b/packages/PackageInstaller/res/values-hr/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može instalirati nepoznate aplikacije"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovaj korisnik nema dopuštenje za instaliranje aplikacija"</string> <string name="ok" msgid="7871959885003339302">"U redu"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Upravljanje apl."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nema dovoljno mjesta"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> nije moguće instalirati. Oslobodite dio prostora i pokušajte ponovo."</string> diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml index db085cafcd44..0ede377a6090 100644 --- a/packages/PackageInstaller/res/values-hu/strings.xml +++ b/packages/PackageInstaller/res/values-hu/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Telepíti ezt az alkalmazást?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Frissíti ezt az alkalmazást?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ez a felhasználó nem telepíthet ismeretlen alkalmazásokat"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ez a felhasználó nem telepíthet alkalmazásokat"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Alkalmazáskezelés"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nincs elég hely"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazást nem lehet telepíteni. Szabadítson fel egy kis helyet, és próbálkozzon újra."</string> diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml index 09be03a92ca7..ccf1ee47d040 100644 --- a/packages/PackageInstaller/res/values-hy/strings.xml +++ b/packages/PackageInstaller/res/values-hy/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string> <string name="install_confirm_question" msgid="7663733664476363311">"Տեղադրե՞լ այս հավելվածը:"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Թարմացնե՞լ այս հավելվածը։"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Այս օգտատերը չի կարող անհայտ հավելվածներ տեղադրել"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Այս օգտատիրոջը չի թույլատրվում տեղադրել հավելվածներ"</string> <string name="ok" msgid="7871959885003339302">"Եղավ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Կառավարել հավելվածները"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Բավարար տարածք չկա"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Չհաջողվեց տեղադրել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը: Ազատեք տարածք և նորից փորձեք:"</string> diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml index ed6d23f0cfa7..0e4d700643b2 100644 --- a/packages/PackageInstaller/res/values-in/strings.xml +++ b/packages/PackageInstaller/res/values-in/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingin menginstal aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingin mengupdate aplikasi ini?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplikasi yang tidak dikenal tidak dapat diinstal oleh pengguna ini"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Pengguna ini tidak diizinkan menginstal aplikasi"</string> <string name="ok" msgid="7871959885003339302">"Oke"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Kelola aplikasi"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kehabisan ruang penyimpanan"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat diinstal. Kosongkan sebagian ruang dan coba lagi."</string> diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml index 1da54cbf188e..64086c8d5702 100644 --- a/packages/PackageInstaller/res/values-is/strings.xml +++ b/packages/PackageInstaller/res/values-is/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Viltu setja upp þetta forrit?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Viltu uppfæra þetta forrit?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Þessi notandi getur ekki sett upp óþekkt forrit"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Þessi notandi hefur ekki leyfi til að setja upp forrit"</string> <string name="ok" msgid="7871959885003339302">"Í lagi"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Stj. forritum"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Ekkert pláss eftir"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ekki tókst að setja <xliff:g id="APP_NAME">%1$s</xliff:g> upp. Losaðu um pláss og reyndu aftur."</string> diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index c288d96dc7ac..617bfda063a5 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App installata."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vuoi installare questa app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vuoi aggiornare questa app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App non installata."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Questo utente non può installare app sconosciute"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"L\'utente non è autorizzato a installare app"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gestisci app"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Spazio esaurito"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossibile installare <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera dello spazio e riprova."</string> diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index e3893d21441f..226121832dbe 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string> <string name="install_confirm_question" msgid="7663733664476363311">"האם ברצונך להתקין אפליקציה זו?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"האם ברצונך לעדכן אפליקציה זו?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"למשתמש הזה אין הרשאה להתקין אפליקציות שאינן מוכרות"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"למשתמש הזה אין הרשאה להתקין אפליקציות"</string> <string name="ok" msgid="7871959885003339302">"אישור"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ניהול אפליקציות"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק מקום"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g>. יש לפנות מקום אחסון ולנסות שוב."</string> diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index 62149d1a5efe..9764f1b9ddab 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"このアプリをインストールしますか?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"このアプリを更新しますか?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"このユーザーは不明なアプリをインストールできません"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"このユーザーはアプリをインストールできません"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"アプリの管理"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"容量不足"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> をインストールできませんでした。空き容量を増やしてもう一度お試しください。"</string> diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml index 507a262b48e4..ee0cefaadcf4 100644 --- a/packages/PackageInstaller/res/values-ka/strings.xml +++ b/packages/PackageInstaller/res/values-ka/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string> <string name="install_confirm_question" msgid="7663733664476363311">"გნებავთ ამ აპის დაყენება?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"გსურთ ამ აპის განახლება?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ამ მომხმარებელს არ შეუძლია უცნობი აპების ინსტალაცია"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ამ მომხმარებელს არ აქვს აპების ინსტალაციის უფლება"</string> <string name="ok" msgid="7871959885003339302">"კარგი"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"აპების მართვა"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"მეხსიერება არასაკმარისია"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვერ დაინსტალირდა. გაათავისუფლეთ მეხსიერება და ცადეთ ხელახლა."</string> diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml index 6e11f2a3a263..27b0289a3631 100644 --- a/packages/PackageInstaller/res/values-kk/strings.xml +++ b/packages/PackageInstaller/res/values-kk/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бұл қолданбаны орнатқыңыз келе ме?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бұл қолданбаны жаңартқыңыз келе ме?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Бұл пайдаланушы белгісіз қолданбаларды орната алмайды"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Бұл пайдаланушының қолданбаларды орнату рұқсаты жоқ"</string> <string name="ok" msgid="7871959885003339302">"Жарайды"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Қолданбаларды басқару"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Орын жоқ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы орнатылмады. Орын босатып, қайталап көріңіз."</string> diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml index d744ff7b2368..126218177bf4 100644 --- a/packages/PackageInstaller/res/values-km/strings.xml +++ b/packages/PackageInstaller/res/values-km/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string> <string name="install_confirm_question" msgid="7663733664476363311">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"តើអ្នកចង់ដំឡើងកំណែកម្មវិធីនេះដែរទេ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"អ្នកប្រើប្រាស់នេះមិនអាចដំឡើងកម្មវិធីមិនស្គាល់បានទេ"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"មិនអនុញ្ញាតឱ្យអ្នកប្រើប្រាស់នេះដំឡើងកម្មវិធីទេ"</string> <string name="ok" msgid="7871959885003339302">"យល់ព្រម"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"គ្រប់គ្រងកម្មវិធី"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"អស់ទំហំផ្ទុក"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"មិនអាចដំឡើង <xliff:g id="APP_NAME">%1$s</xliff:g> បានទេ។ សូមបង្កើនទំហំផ្ទុកទំនេរមួយចំនួន រួចព្យាយាមម្ដងទៀត។"</string> diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml index fe8144ea2c22..43aaab1e7c94 100644 --- a/packages/PackageInstaller/res/values-kn/strings.xml +++ b/packages/PackageInstaller/res/values-kn/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ಈ ಬಳಕೆದಾರರು ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಈ ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string> <string name="ok" msgid="7871959885003339302">"ಸರಿ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ಆ್ಯಪ್ ನಿರ್ವಹಿಸಿ"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ಸಂಗ್ರಹಣೆ ಖಾಲಿ ಇಲ್ಲ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಕೊಂಚ ಸ್ಥಳವನ್ನು ಖಾಲಿ ಮಾಡಿ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index 4bfa3cc00d17..9da1182fad43 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string> <string name="install_confirm_question" msgid="7663733664476363311">"이 앱을 설치하시겠습니까?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"이 앱을 업데이트하시겠습니까?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"이 사용자는 알 수 없는 앱을 설치할 수 없습니다."</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"이 사용자는 앱을 설치할 권한이 없습니다."</string> <string name="ok" msgid="7871959885003339302">"확인"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"앱 관리"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"여유 공간이 없음"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 설치할 수 없습니다. 여유 공간을 늘린 후에 다시 시도하세요."</string> diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml index 5888b7b4d98e..00a32f4b782d 100644 --- a/packages/PackageInstaller/res/values-ky/strings.xml +++ b/packages/PackageInstaller/res/values-ky/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бул колдонмону орнотоюн деп жатасызбы?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бул колдонмону жаңыртайын деп жатасызбы?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Бул колдонуучу белгисиз колдонмолорду орното албайт"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Бул колдонуучу колдонмолорду орното албайт"</string> <string name="ok" msgid="7871959885003339302">"ЖАРАЙТ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Колд. башкаруу"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Бош орун жок"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун телефонуңузга орнотуу мүмкүн эмес. Орун бошотуп, кайталап орнотуп көрүңүз."</string> diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml index f9866b0a8e14..3cce796b3516 100644 --- a/packages/PackageInstaller/res/values-lo/strings.xml +++ b/packages/PackageInstaller/res/values-lo/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບນີ້ບໍ່?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ທ່ານຕ້ອງການອັບເດດແອັບນີ້ບໍ່?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ຜູ້ໃຊ້ນີ້ບໍ່ສາມາດຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ຈັກໄດ້"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ຜູ້ໃຊ້ນີ້ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ຕິດຕັ້ງແອັບໄດ້"</string> <string name="ok" msgid="7871959885003339302">"ຕົກລົງ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ຈັດການແອັບ"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ພື້ນທີ່ຫວ່າງບໍ່ພຽງພໍ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"ບໍ່ສາມາດຕິດຕັ້ງ <xliff:g id="APP_NAME">%1$s</xliff:g> ໄດ້. ກະລຸນາລຶບຂໍ້ມູນທີ່ບໍ່ຈຳເປັນອອກເພື່ອໃຫ້ມີບ່ອນຈັດເກັບຂໍ້ມູນຫວ່າງເພີ່ມຂຶ້ນ ແລ້ວລອງໃໝ່ອີກຄັ້ງ."</string> diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml index 9bf018b733ba..a7ec560e7023 100644 --- a/packages/PackageInstaller/res/values-lt/strings.xml +++ b/packages/PackageInstaller/res/values-lt/strings.xml @@ -26,6 +26,7 @@ <string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ar norite įdiegti šią programą?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ar norite atnaujinti šią programą?"</string> + <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atnaujinti šią programą iš <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nŠi programa įprastai gauna naujinius iš <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Atnaujinę iš kito šaltinio, būsimus naujinius galite gauti iš bet kurio šaltinio telefone. Gali būti pakeistos programos funkcijos."</string> <string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string> @@ -41,6 +42,7 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Šis naudotojas negali diegti nežinomų programų"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Šiam naudotojui neleidžiama diegti programų"</string> <string name="ok" msgid="7871959885003339302">"Gerai"</string> + <string name="update_anyway" msgid="8792432341346261969">"Vis tiek atnaujinti"</string> <string name="manage_applications" msgid="5400164782453975580">"Tvark. progr."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nėra vietos"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Nepavyko įdiegti programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“. Atlaisvinkite vietos ir bandykite dar kartą."</string> diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml index 823858c79171..55a9f3ca0c9a 100644 --- a/packages/PackageInstaller/res/values-lv/strings.xml +++ b/packages/PackageInstaller/res/values-lv/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vai vēlaties instalēt šo lietotni?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vai vēlaties atjaunināt šo lietotni?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Šis lietotājs nevar instalēt nezināmas lietotnes"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Šim lietotājam nav atļauts instalēt lietotnes"</string> <string name="ok" msgid="7871959885003339302">"Labi"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Pārv. lietotnes"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nav brīvas vietas"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Lietotni <xliff:g id="APP_NAME">%1$s</xliff:g> nevarēja instalēt. Atbrīvojiet vietu un mēģiniet vēlreiz."</string> diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index 529ea3e63b74..4024d8a62810 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Дали сакате да ја инсталирате апликацијава?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Дали сакате да ја ажурирате апликацијава?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Корисников не може да инсталира непознати апликации"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"На корисников не му е дозволено да инсталира апликации"</string> <string name="ok" msgid="7871959885003339302">"Во ред"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Управување со апликациите"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Нема простор"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира. Ослободете простор и обидете се повторно."</string> diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml index 43cac7a6d0e2..42790b2d5f26 100644 --- a/packages/PackageInstaller/res/values-ml/strings.xml +++ b/packages/PackageInstaller/res/values-ml/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ഈ ഉപയോക്താവിന്, അജ്ഞാത ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ ഈ ഉപയോക്താവിന് അനുവാദമില്ല"</string> <string name="ok" msgid="7871959885003339302">"ശരി"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ആപ്പുകൾ മാനേജ് ചെയ്യുക"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ഇടമില്ല"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. കുറച്ച് ഇടമുണ്ടാക്കി, വീണ്ടും ശ്രമിക്കുക."</string> diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml index 02439312cd6a..01e7aec37f5e 100644 --- a/packages/PackageInstaller/res/values-mn/strings.xml +++ b/packages/PackageInstaller/res/values-mn/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Та энэ аппыг шинэчлэхийг хүсэж байна уу?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Энэ хэрэглэгч тодорхойгүй апп суулгах боломжгүй"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Энэ хэрэглэгч нь апп суулгах зөвшөөрөлгүй байна"</string> <string name="ok" msgid="7871959885003339302">"ОК"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Аппуудыг удирдах"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Орон зай дутагдаж байна"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г суулгаж чадсангүй. Хэсэг зай чөлөөлөөд дахин оролдоно уу."</string> diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml index 8a4ff440d610..5ae257af3ea0 100644 --- a/packages/PackageInstaller/res/values-mr/strings.xml +++ b/packages/PackageInstaller/res/values-mr/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string> <string name="install_confirm_question" msgid="7663733664476363311">"तुम्हाला हे ॲप इंस्टॉल करायचे आहे का?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तुम्हाला हे ॲप अपडेट करायचे आहे का?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"या वापरकर्त्याद्वारे अज्ञात अॅप्स इंस्टॉल केली जाऊ शकत नाहीत"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"या वापरकर्त्याला अॅप्स इंस्टॉल करण्याची अनुमती नाही"</string> <string name="ok" msgid="7871959885003339302">"ओके"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"अॅप्स व्यवस्थापन"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"जागा संपली"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> इंस्टॉल केले जाऊ शकत नाही. काही जागा मोकळी करा आणि पुन्हा प्रयत्न करा."</string> diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml index 13531bd13154..a26d2743c4f7 100644 --- a/packages/PackageInstaller/res/values-ms/strings.xml +++ b/packages/PackageInstaller/res/values-ms/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Adakah anda ingin memasang aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Adakah anda mahu mengemas kini apl ini?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apl yang tidak diketahui tidak boleh dipasang oleh pengguna ini"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Pengguna ini tidak dibenarkan memasang apl"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Urus apl"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kehabisan ruang"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat dipasang. Kosongkan sebahagian ruang dan cuba lagi."</string> diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml index 4dbf3fc816eb..db21cf71f473 100644 --- a/packages/PackageInstaller/res/values-my/strings.xml +++ b/packages/PackageInstaller/res/values-my/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ။"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ဤအက်ပ်ကို ထည့်သွင်းလိုသလား။"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ဤအက်ပ်ကို အပ်ဒိတ်လုပ်လိုသလား။"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"အရင်းအမြစ်မသိသော အက်ပ်များကို ဤအသုံးပြုသူက ထည့်သွင်းခွင့်မရှိပါ"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ဤအသုံးပြုသူသည် အက်ပ်များကို ထည့်သွင်းခွင့်မရှိပါ"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"အက်ပ်စီမံခြင်း"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"နေရာလွတ်မရှိပါ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ထည့်သွင်း၍ မရနိုင်ပါ။ နေရာလွတ်ပြုလုပ်ပြီး ထပ်စမ်းကြည့်ပါ။"</string> diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml index 8ec94e012476..94b7f50d1056 100644 --- a/packages/PackageInstaller/res/values-nb/strings.xml +++ b/packages/PackageInstaller/res/values-nb/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du oppdatere denne appen?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ukjente apper kan ikke installeres av denne brukeren"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Brukeren har ikke tillatelse til å installere apper"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Administrer apper"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Tom for plass"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kunne ikke installeres. Frigjør plass og prøv på nytt."</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index d6451eb232cd..d531d5ce3a7a 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"एप इन्स्टल गरियो।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"तपाईं यो एप इन्स्टल गर्न चाहनुहुन्छ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तपाईं यो एप अपडेट गर्न चाहनुहुन्छ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात एपहरू इन्स्टल गर्न सक्नुहुन्न"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई एपहरू इन्स्टल गर्ने अनुमति छैन"</string> <string name="ok" msgid="7871959885003339302">"ठिक छ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"एपको प्रबन्ध गर्नु…"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"खाली ठाउँ छैन"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन। केही ठाउँ खाली गरेर फेरि प्रयास गर्नुहोस्।"</string> diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index c0a3c8ee872e..ad4df64fe6f3 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil je deze app installeren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil je deze app updaten?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Onbekende apps kunnen niet worden geïnstalleerd door deze gebruiker"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Deze gebruiker mag geen apps installeren"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Apps beheren"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Geen ruimte beschikbaar"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan niet worden geïnstalleerd. Maak ruimte vrij en probeer het opnieuw."</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index 965c7d8a5d98..db908fd14f0c 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ଆପ ଇନଷ୍ଟଲ ହୋଇଗଲା।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ଆପଣ ଏହି ଆପକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ଆପଣ ଏହି ଆପକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ଏହି ୟୁଜରଙ୍କ ଦ୍ୱାରା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରାଯାଇପାରିବ ନାହିଁ"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ଏହି ୟୁଜର୍ ଆପ୍ ଇନଷ୍ଟଲ୍ କରିପାରିବେ ନାହିଁ"</string> <string name="ok" msgid="7871959885003339302">"ଠିକ୍ ଅଛି"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ଆପ୍ଗୁଡ଼ିକର ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ଆଉ ସ୍ଥାନ ନାହିଁ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ କରାଯାଇପାରିଲା ନାହିଁ। କିଛି ସ୍ଥାନ ଖାଲିକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index 2a3068c42cb0..64dd9c7c1503 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ਇਹ ਵਰਤੋਂਕਾਰ ਅਗਿਆਤ ਐਪਾਂ ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕਰ ਸਕਦਾ"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string> <string name="ok" msgid="7871959885003339302">"ਠੀਕ ਹੈ"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ਐਪਾਂ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ਜਗ੍ਹਾ ਖਾਲੀ ਨਹੀਂ"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕੁਝ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml index dc4e0c98aa9c..c05c81a6f7cc 100644 --- a/packages/PackageInstaller/res/values-pl/strings.xml +++ b/packages/PackageInstaller/res/values-pl/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Zainstalować tę aplikację?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Zaktualizować tę aplikację?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ten użytkownik nie może instalować nieznanych aplikacji"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ten użytkownik nie może instalować aplikacji"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Zarządzaj aplikacjami"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Brak miejsca"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Nie można zainstalować aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>. Zwolnij trochę miejsca i spróbuj ponownie."</string> diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml index a5ee82bd4840..f2eab25522eb 100644 --- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apps desconhecidos não podem ser instalados por este usuário"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuário não tem permissão para instalar apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gerenciar apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libere um pouco de espaço e tente novamente."</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index 9e80a970099f..c44088056405 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este utilizador não pode instalar aplicações desconhecidas."</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este utilizador não tem autorização para instalar aplicações."</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gerir app"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g>. Liberte algum espaço e tente novamente."</string> diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml index a5ee82bd4840..f2eab25522eb 100644 --- a/packages/PackageInstaller/res/values-pt/strings.xml +++ b/packages/PackageInstaller/res/values-pt/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apps desconhecidos não podem ser instalados por este usuário"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuário não tem permissão para instalar apps"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gerenciar apps"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libere um pouco de espaço e tente novamente."</string> diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 09693bffdc5e..f12e3648aaba 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vrei să instalezi această aplicație?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vrei să actualizezi această aplicație?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplicațiile necunoscute nu pot fi instalate de acest utilizator"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Acest utilizator nu are permisiunea să instaleze aplicații"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Gestionează"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Spațiu de stocare insuficient"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplicația <xliff:g id="APP_NAME">%1$s</xliff:g> nu a putut fi instalată. Eliberează spațiu și încearcă din nou."</string> diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml index f70c4bc27908..e7e9e33b2de4 100644 --- a/packages/PackageInstaller/res/values-ru/strings.xml +++ b/packages/PackageInstaller/res/values-ru/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установить приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Обновить приложение?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Этот пользователь не может устанавливать неизвестные приложения."</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Этому пользователю не разрешено устанавливать приложения."</string> <string name="ok" msgid="7871959885003339302">"ОК"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Управление приложениями"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Недостаточно места"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Не удалось установить приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\". Освободите место на устройстве и повторите попытку."</string> diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml index cfe29cb32cdd..0f5dbb6d68a9 100644 --- a/packages/PackageInstaller/res/values-si/strings.xml +++ b/packages/PackageInstaller/res/values-si/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string> <string name="install_confirm_question" msgid="7663733664476363311">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ඔබට මෙම යෙදුම යාවත්කාලීන කිරීමට අවශ්යද?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"මෙම පරිශීලකයා මඟින් නොදන්නා යෙදුම් ස්ථාපනය කළ නොහැක"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"මෙම පරිශීලකයාට යෙදුම් ස්ථාපනය කිරීමට අවසර නැත"</string> <string name="ok" msgid="7871959885003339302">"හරි"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"යෙදුම් කළමනාකරණය කරන්න"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ඉඩ නොමැත"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ස්ථාපිත කිරීමට නොහැකි විය. ඉඩ පොඩ්ඩක් නිදහස් කොට නැවත උත්සාහ කරන්න."</string> diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index 181ff9c0a640..8363fb6117cc 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete túto aplikáciu nainštalovať?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete túto aplikáciu aktualizovať?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tento používateľ nemôže inštalovať neznáme aplikácie"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tento používateľ nemá povolené inštalovať aplikácie"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Spravovať aplikácie"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatok miesta"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> sa nepodarilo nainštalovať. Uvoľnite miesto v pamäti a skúste to znova."</string> diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml index 35b3fda33a29..5c2897965f14 100644 --- a/packages/PackageInstaller/res/values-sl/strings.xml +++ b/packages/PackageInstaller/res/values-sl/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ali želite namestiti to aplikacijo?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ali želite posodobiti to aplikacijo?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ta uporabnik nima dovoljenja za nameščanje neznanih aplikacij"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ta uporabnik nima dovoljenja za nameščanje aplikacij"</string> <string name="ok" msgid="7871959885003339302">"V redu"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Upravlj. aplik."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Zmanjkalo je prostora"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> ni bilo mogoče namestiti. Sprostite prostor in poskusite znova."</string> diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml index f58efea0d2ba..709b7fd5bc3e 100644 --- a/packages/PackageInstaller/res/values-sq/strings.xml +++ b/packages/PackageInstaller/res/values-sq/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Dëshiron ta instalosh këtë aplikacion?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Dëshiron ta përditësosh këtë aplikacion?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplikacionet e panjohura nuk mund të instalohen nga ky përdorues"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ky përdorues nuk lejohet të instalojë aplikacione"</string> <string name="ok" msgid="7871959885003339302">"Në rregull"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Menaxho aplikacionet"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nuk ka hapësirë"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mund të instalohej. Liro pak hapësirë dhe provo përsëri."</string> diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 2e448ad04e9b..3a62db3af95a 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Желите да инсталирате ову апликацију?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Желите да ажурирате ову апликацију?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Овај корисник не може да инсталира непознате апликације"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Овом кориснику није дозвољено да инсталира апликације"</string> <string name="ok" msgid="7871959885003339302">"Потврди"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Управљајте апл."</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Нема више простора"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Нисмо успели да инсталирамо апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>. Ослободите простор и пробајте поново."</string> diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index cb12c9148915..d8ed4b1ce62a 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vill du installera den här appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vill du uppdatera den här appen?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Denna användare får inte installera okända appar"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Användaren har inte behörighet att installera appar"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Hantera appar"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Slut på utrymme"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Det gick inte att avinstallera <xliff:g id="APP_NAME">%1$s</xliff:g>. Frigör minne och försök igen."</string> diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml index 64e24f94ec57..4919cb55ab01 100644 --- a/packages/PackageInstaller/res/values-sw/strings.xml +++ b/packages/PackageInstaller/res/values-sw/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ungependa kusakinisha programu hii?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ungependa kusasisha programu hii?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Mtumiaji huyu hana idhini ya kusakinisha programu ambazo hazijulikani"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Mtumiaji huyu haruhusiwi kusakinisha programu"</string> <string name="ok" msgid="7871959885003339302">"Sawa"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Dhibiti programu"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nafasi imejaa"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Imeshindwa kusakinisha <xliff:g id="APP_NAME">%1$s</xliff:g>. Futa baadhi ya maudhui ili upate nafasi kisha ujaribu tena."</string> diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml index 71970c49cf37..d867ee89c570 100644 --- a/packages/PackageInstaller/res/values-ta/strings.xml +++ b/packages/PackageInstaller/res/values-ta/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string> <string name="install_confirm_question" msgid="7663733664476363311">"இந்த ஆப்ஸை நிறுவ வேண்டுமா?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"அறியப்படாத ஆப்ஸை இந்தப் பயனரால் நிறுவ இயலாது"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ஆப்ஸை நிறுவ இந்தப் பயனருக்கு அனுமதியில்லை"</string> <string name="ok" msgid="7871959885003339302">"சரி"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ஆப்ஸை நிர்வகி"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"போதுமான சேமிப்பிடம் இல்லை"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை நிறுவ இயலவில்லை. சிறிது சேமிப்பிடத்தைக் காலிசெய்து மீண்டும் முயலவும்."</string> diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index 67a15fb9f0c1..7e1c9daef4c4 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string> <string name="install_confirm_question" msgid="7663733664476363311">"మీరు ఈ యాప్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"మీరు ఈ యాప్ను అప్డేట్ చేయాలనుకుంటున్నారా?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ఈ వినియోగదారు తెలియని యాప్లను ఇన్స్టాల్ చేయలేరు"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"యాప్లను ఇన్స్టాల్ చేయడానికి ఈ వినియోగదారుకు అనుమతి లేదు"</string> <string name="ok" msgid="7871959885003339302">"సరే"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"యాప్లను నిర్వహించండి"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ఖాళీ లేదు"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>ని ఇన్స్టాల్ చేయడం సాధ్యపడలేదు. కొంత స్థలాన్ని ఖాళీ చేసి మళ్లీ ప్రయత్నించండి."</string> diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml index de8f727e9d62..37caaa7388f5 100644 --- a/packages/PackageInstaller/res/values-th/strings.xml +++ b/packages/PackageInstaller/res/values-th/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string> <string name="install_confirm_question" msgid="7663733664476363311">"คุณต้องการติดตั้งแอปนี้ไหม"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"คุณต้องการอัปเดตแอปนี้ไหม"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ผู้ใช้รายนี้ไม่สามารถติดตั้งแอปที่ไม่รู้จัก"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ผู้ใช้รายนี้ไม่ได้รับอนุญาตให้ติดตั้งแอป"</string> <string name="ok" msgid="7871959885003339302">"ตกลง"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"จัดการแอป"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ไม่มีพื้นที่"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"ติดตั้ง <xliff:g id="APP_NAME">%1$s</xliff:g> ไม่ได้ เพิ่มพื้นที่ว่างแล้วลองอีกครั้ง"</string> diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml index add425806c42..87c408ae3684 100644 --- a/packages/PackageInstaller/res/values-tl/strings.xml +++ b/packages/PackageInstaller/res/values-tl/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Gusto mo bang i-install ang app na ito?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Gusto mo bang i-update ang app na ito?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Hindi maaaring mag-install ang user na ito ng mga hindi kilalang app"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Hindi pinapayagan ang user na ito na mag-install ng mga app"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Pamahalaan ang app"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Wala nang espasyo"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Hindi ma-install ang <xliff:g id="APP_NAME">%1$s</xliff:g>. Magbakante ng ilang espasyo at subukan ulit."</string> diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml index a006c068c818..a775b4c36fa7 100644 --- a/packages/PackageInstaller/res/values-tr/strings.xml +++ b/packages/PackageInstaller/res/values-tr/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu uygulamayı yüklemek istiyor musunuz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu uygulamayı güncellemek istiyor musunuz?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Bilinmeyen uygulamalar bu kullanıcı tarafından yüklenemez"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu kullanıcının uygulama yüklemesine izin verilmiyor"</string> <string name="ok" msgid="7871959885003339302">"Tamam"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Uygulamaları yönet"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Yer kalmadı"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> yüklenemedi. Boş alan açın ve yeniden deneyin."</string> diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml index d8928e53e80a..ab07754827cd 100644 --- a/packages/PackageInstaller/res/values-uk/strings.xml +++ b/packages/PackageInstaller/res/values-uk/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установити цей додаток?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Оновити цей додаток?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Цей користувач не може встановлювати невідомі додатки"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Цей користувач не може встановлювати додатки"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Керувати додатками"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Недостат. місця"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Програму <xliff:g id="APP_NAME">%1$s</xliff:g> неможливо встановити. Звільніть місце та повторіть спробу."</string> diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml index 21f6cdfb9602..4f23cd2a1f10 100644 --- a/packages/PackageInstaller/res/values-ur/strings.xml +++ b/packages/PackageInstaller/res/values-ur/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string> <string name="install_confirm_question" msgid="7663733664476363311">"کیا آپ یہ ایپ انسٹال کرنا چاہتے ہیں؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"کیا آپ یہ ایپ اپ ڈیٹ کرنا چاہتے ہیں؟"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"یہ صارف نامعلوم ایپس کو انسٹال نہیں کر سکتا"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"اس صارف کو ایپس انسٹال کرنے کی اجازت نہیں ہے"</string> <string name="ok" msgid="7871959885003339302">"ٹھیک ہے"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"ایپس منظم کریں"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"جگہ نہیں ہے"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو انسٹال نہیں کیا جا سکا۔ کچھ جگہ خالی کریں اور دوبارہ کوشش کریں۔"</string> diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml index bb225bccbf26..48d8681a2cd2 100644 --- a/packages/PackageInstaller/res/values-uz/strings.xml +++ b/packages/PackageInstaller/res/values-uz/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu ilovani oʻrnatmoqchimisiz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu ilova yangilansinmi?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Notanish ilovalarni bu foydalanuvchi tomonidan o‘rnatib bo‘lmaydi"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu foydalanuvchiga ilovalarni o‘rnatish uchun ruxsat berilmagan"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Ilovalarni boshqarish"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Joy qolmadi"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> o‘rnatilmadi. Xotiradan biroz joy bo‘shating va qaytadan urining."</string> diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml index 1e0df14fbf01..4cc563da2ce3 100644 --- a/packages/PackageInstaller/res/values-vi/strings.xml +++ b/packages/PackageInstaller/res/values-vi/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bạn có muốn cài đặt ứng dụng này không?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bạn có muốn cập nhật ứng dụng này không?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Người dùng này không thể cài đặt ứng dụng không xác định"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Người dùng này không được phép cài đặt ứng dụng"</string> <string name="ok" msgid="7871959885003339302">"OK"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Quản lý ứng dụng"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Hết dung lượng"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Không thể cài đặt <xliff:g id="APP_NAME">%1$s</xliff:g>. Hãy giải phóng dung lượng và thử lại."</string> diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml index f25da81a2212..b4bf413e6cb9 100644 --- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"已安装应用。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安装此应用吗?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此应用吗?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"该用户无法安装未知应用"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"此用户无权安装应用"</string> <string name="ok" msgid="7871959885003339302">"确定"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"管理应用"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"空间不足"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"无法安装<xliff:g id="APP_NAME">%1$s</xliff:g>。请释放一些存储空间并重试。"</string> diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml index 46f3b9f7a4d3..0c4ed6c7960e 100644 --- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝此應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此應用程式嗎?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"此使用者無法安裝來源不明的應用程式"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"此使用者無法安裝應用程式"</string> <string name="ok" msgid="7871959885003339302">"確定"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"管理應用程式"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"儲存空間不足"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"無法安裝「<xliff:g id="APP_NAME">%1$s</xliff:g>」。請先騰出一些儲存空間,然後再試一次。"</string> diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml index cf8cd599ba08..9b7bda6af6e5 100644 --- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝這個應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新這個應用程式嗎?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"這位使用者無法安裝不明的應用程式"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"這位使用者無法安裝應用程式"</string> <string name="ok" msgid="7871959885003339302">"確定"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"管理應用程式"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"空間不足"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"無法安裝「<xliff:g id="APP_NAME">%1$s</xliff:g>」。請先釋出部分空間,然後再試一次。"</string> diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml index afdfd822996e..7317abc3d617 100644 --- a/packages/PackageInstaller/res/values-zu/strings.xml +++ b/packages/PackageInstaller/res/values-zu/strings.xml @@ -26,6 +26,8 @@ <string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingabe ufuna ukufaka le app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingabe ufuna ukubuyekeza le app?"</string> + <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string> @@ -41,6 +43,8 @@ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Izinhlelo zokusebenza ezingaziwa azikwazi ukufakwa ilo msebenzisi"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Lo msebenzisi akavunyelwe ukufaka izinhlelo zokusebenza"</string> <string name="ok" msgid="7871959885003339302">"KULUNGILE"</string> + <!-- no translation found for update_anyway (8792432341346261969) --> + <skip /> <string name="manage_applications" msgid="5400164782453975580">"Phatha izinhlelo zokusebenza"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Iphelelwe yisikhala"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayikwazanga ukufakwa. Khulula isikhala bese uzama futhi."</string> diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt index b67eb3d59645..ba8c03d9438d 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt @@ -19,6 +19,8 @@ package com.android.settingslib.spa.widget.preference import androidx.compose.foundation.LocalIndication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.width import androidx.compose.foundation.selection.toggleable import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.AirplanemodeActive @@ -140,6 +142,7 @@ internal fun InternalSwitchPreference( paddingVertical = paddingVertical, icon = icon, ) { + Spacer(Modifier.width(SettingsDimension.itemPaddingEnd)) SettingsSwitch( checked = checked, changeable = changeable, diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 241d6d5526a0..08c2f7b3b720 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -245,12 +245,12 @@ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi-tilkoblingskode"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Tilkoblingen mislyktes"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Sørg for at enheten er koblet til samme nettverk."</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Koble til enheten via Wifi ved å skanne en QR-kode"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Koble til enheten via wifi ved å skanne en QR-kode"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Kobler til enheten …"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Kunne ikke koble til enheten. Enten var QR-koden feil, eller enheten er ikke koblet til samme nettverk."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adresse og port"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skann QR-koden"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Koble til enheten via Wifi ved å skanne en QR-kode"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Koble til enheten via wifi ved å skanne en QR-kode"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Koble til et Wifi-nettverk"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, feilsøking, utvikler"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Snarvei til feilrapport"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index b6a3a62aa8df..0e3afaefc89b 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -213,7 +213,7 @@ <item msgid="6946761421234586000">"Asilimia 400"</item> </string-array> <string name="choose_profile" msgid="343803890897657450">"Chagua wasifu"</string> - <string name="category_personal" msgid="6236798763159385225">"Ya Binafsi"</string> + <string name="category_personal" msgid="6236798763159385225">"Binafsi"</string> <string name="category_work" msgid="4014193632325996115">"Ya Kazini"</string> <string name="development_settings_title" msgid="140296922921597393">"Chaguo za wasanidi"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Washa chaguo za wasanidi programu"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index a3d632cfb82a..04168ce6d79a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -940,6 +940,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> + getName() + ", groupId=" + mGroupId + + ", member= " + mMemberDevices + ")"; } @@ -1494,33 +1495,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * In order to show the preference for the whole group, we always set the main device as the - * first connected device in the coordinated set, and then switch the content of the main - * device and member devices. - * - * @param newMainDevice the new Main device which is from the previous main device's member - * list. - */ - public void switchMemberDeviceContent(CachedBluetoothDevice newMainDevice) { - // Backup from main device - final BluetoothDevice tmpDevice = mDevice; - final short tmpRssi = mRssi; - final boolean tmpJustDiscovered = mJustDiscovered; - // Set main device from sub device - release(); - mDevice = newMainDevice.mDevice; - mRssi = newMainDevice.mRssi; - mJustDiscovered = newMainDevice.mJustDiscovered; - - // Set sub device from backup - newMainDevice.release(); - newMainDevice.mDevice = tmpDevice; - newMainDevice.mRssi = tmpRssi; - newMainDevice.mJustDiscovered = tmpJustDiscovered; - fetchActiveDevices(); - } - - /** * Get cached bluetooth icon with description */ public Pair<Drawable, String> getDrawableWithDescription() { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 7b4c86207a2a..d191b1e1c0e6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -464,6 +464,59 @@ public class CachedBluetoothDeviceManager { return !(mOngoingSetMemberPair == null) && mOngoingSetMemberPair.equals(device); } + /** + * In order to show the preference for the whole group, we always set the main device as the + * first connected device in the coordinated set, and then switch the relationship of the main + * device and member devices. + * + * @param newMainDevice the new Main device which is from the previous main device's member + * list. + */ + public void switchRelationshipFromMemberToMain(CachedBluetoothDevice newMainDevice) { + if (newMainDevice == null) { + log("switchRelationshipFromMemberToMain: input is null"); + return; + } + log("switchRelationshipFromMemberToMain: CachedBluetoothDevice list: " + mCachedDevices); + + final CachedBluetoothDevice finalNewMainDevice = newMainDevice; + int newMainGroupId = newMainDevice.getGroupId(); + CachedBluetoothDevice oldMainDevice = mCachedDevices.stream() + .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice) + && cachedDevice.getGroupId() == newMainGroupId).findFirst().orElse(null); + boolean hasMainDevice = oldMainDevice != null; + Set<CachedBluetoothDevice> memberSet = + hasMainDevice ? oldMainDevice.getMemberDevice() : null; + boolean isMemberDevice = memberSet != null && memberSet.contains(newMainDevice); + if (!hasMainDevice || !isMemberDevice) { + log("switchRelationshipFromMemberToMain: " + + newMainDevice.getDevice().getAnonymizedAddress() + + " is not the member device."); + return; + } + + mCachedDevices.remove(oldMainDevice); + // When both LE Audio devices are disconnected, receiving member device + // connection. To switch content and dispatch to notify UI change + mBtManager.getEventManager().dispatchDeviceRemoved(oldMainDevice); + + for (CachedBluetoothDevice memberDeviceItem : memberSet) { + if (memberDeviceItem.equals(newMainDevice)) { + continue; + } + newMainDevice.addMemberDevice(memberDeviceItem); + } + memberSet.clear(); + newMainDevice.addMemberDevice(oldMainDevice); + + mCachedDevices.add(newMainDevice); + // It is necessary to do remove and add for updating the mapping on + // preference and device + mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice); + log("switchRelationshipFromMemberToMain: After change, CachedBluetoothDevice list: " + + mCachedDevices); + } + private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java index 20a6cd8e09ce..814c395865b1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -238,14 +238,10 @@ public class CsipDeviceManager { mainDevice.refresh(); return true; } else { - // When both LE Audio devices are disconnected, receiving member device - // connection. To switch content and dispatch to notify UI change - mBtManager.getEventManager().dispatchDeviceRemoved(mainDevice); - mainDevice.switchMemberDeviceContent(cachedDevice); - mainDevice.refresh(); - // It is necessary to do remove and add for updating the mapping on - // preference and device - mBtManager.getEventManager().dispatchDeviceAdded(mainDevice); + final CachedBluetoothDeviceManager deviceManager = + mBtManager.getCachedDeviceManager(); + deviceManager.switchRelationshipFromMemberToMain(cachedDevice); + cachedDevice.refresh(); return true; } } @@ -266,14 +262,10 @@ public class CsipDeviceManager { for (CachedBluetoothDevice device: memberSet) { if (device.isConnected()) { log("set device: " + device + " as the main device"); - // Main device is disconnected and sub device is connected - // To copy data from sub device to main device - mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice); - cachedDevice.switchMemberDeviceContent(device); - cachedDevice.refresh(); - // It is necessary to do remove and add for updating the mapping on - // preference and device - mBtManager.getEventManager().dispatchDeviceAdded(cachedDevice); + final CachedBluetoothDeviceManager deviceManager = + mBtManager.getCachedDeviceManager(); + deviceManager.switchRelationshipFromMemberToMain(device); + device.refresh(); return true; } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index 24acf8a320a5..c45e8e48b618 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -23,6 +23,7 @@ import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.graphics.drawable.Drawable; +import android.media.AudioDeviceAttributes; import android.media.AudioManager; import android.media.RoutingSessionInfo; import android.os.Build; @@ -566,9 +567,11 @@ public class LocalMediaManager implements BluetoothCallback { } private boolean isMutingExpectedDevice(CachedBluetoothDevice cachedDevice) { - return mAudioManager.getMutingExpectedDevice() != null - && cachedDevice.getAddress().equals( - mAudioManager.getMutingExpectedDevice().getAddress()); + AudioDeviceAttributes mutingExpectedDevice = mAudioManager.getMutingExpectedDevice(); + if (mutingExpectedDevice == null || cachedDevice == null) { + return false; + } + return cachedDevice.getAddress().equals(mutingExpectedDevice.getAddress()); } private List<MediaDevice> buildDisconnectedBluetoothDevice() { diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/OWNERS b/packages/SettingsLib/src/com/android/settingslib/mobile/OWNERS index ab9b5dc3ff7a..c01528fb4f18 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/OWNERS @@ -1,4 +1,7 @@ # Default reviewers for this and subdirectories. -bonianchen@google.com +songferngwang@google.com +zoeychen@google.com # Emergency approvers in case the above are not available +changbetty@google.com +tomhsu@google.com diff --git a/packages/SettingsLib/src/com/android/settingslib/net/OWNERS b/packages/SettingsLib/src/com/android/settingslib/net/OWNERS index ab9b5dc3ff7a..c01528fb4f18 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/net/OWNERS @@ -1,4 +1,7 @@ # Default reviewers for this and subdirectories. -bonianchen@google.com +songferngwang@google.com +zoeychen@google.com # Emergency approvers in case the above are not available +changbetty@google.com +tomhsu@google.com diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java index 4b3820eb0444..1791dce6021f 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -604,4 +604,87 @@ public class CachedBluetoothDeviceManagerTest { verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED); verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE); } + + @Test + public void switchRelationshipFromMemberToMain_switchesMainDevice_switchesSuccessful() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP2).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_moreMembersCase_switchesSuccessful() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isTrue(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice3)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_inputDeviceIsMainDevice_doesNotChangelist() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice1); + + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_inputDeviceNotInMemberList_doesNotChangelist() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + cachedDevice1.getMemberDevice().remove(cachedDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 1c179f838586..ff1af92d71fe 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -1138,25 +1138,6 @@ public class CachedBluetoothDeviceTest { } @Test - public void switchMemberDeviceContent_switchMainDevice_switchesSuccessful() { - mCachedDevice.mRssi = RSSI_1; - mCachedDevice.mJustDiscovered = JUSTDISCOVERED_1; - mSubCachedDevice.mRssi = RSSI_2; - mSubCachedDevice.mJustDiscovered = JUSTDISCOVERED_2; - mCachedDevice.addMemberDevice(mSubCachedDevice); - - mCachedDevice.switchMemberDeviceContent(mSubCachedDevice); - - assertThat(mCachedDevice.mRssi).isEqualTo(RSSI_2); - assertThat(mCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_2); - assertThat(mCachedDevice.mDevice).isEqualTo(mSubDevice); - assertThat(mSubCachedDevice.mRssi).isEqualTo(RSSI_1); - assertThat(mSubCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1); - assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice); - assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue(); - } - - @Test public void isConnectedHearingAidDevice_isConnectedAshaHearingAidDevice_returnTrue() { when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index e0e37200219c..a9d14641af9a 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -137,6 +137,7 @@ public class SettingsBackupTest { Settings.Global.AUTOFILL_LOGGING_LEVEL, Settings.Global.AUTOFILL_MAX_PARTITIONS_SIZE, Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS, + Settings.Global.AUTO_TIME_ZONE_EXPLICIT, Settings.Global.AVERAGE_TIME_TO_DISCHARGE, Settings.Global.BATTERY_CHARGING_STATE_UPDATE_DELAY, Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME, diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 6f7d20a950d5..067efe97f6b6 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -1697,7 +1697,7 @@ public class BugreportProgressService extends Service { } private void collapseNotificationBar() { - sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + closeSystemDialogs(); } private static Looper newLooper(String name) { diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 9b3f1a8f0734..09c62d01cdaa 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -347,6 +347,15 @@ <uses-permission android:name="android.permission.MONITOR_KEYBOARD_BACKLIGHT" /> + <!-- Intent Chooser --> + <permission + android:name="android.permission.ADD_CHOOSER_PINS" + android:protectionLevel="signature" /> + <uses-permission android:name="android.permission.ADD_CHOOSER_PINS" /> + <permission + android:name="android.permission.RECEIVE_CHOOSER_PIN_MIGRATION" + android:protectionLevel="signature" /> + <protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" /> <protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" /> <protected-broadcast android:name="com.android.settings.flashlight.action.FLASHLIGHT_CHANGED" /> @@ -923,7 +932,7 @@ android:showForAllUsers="true" android:finishOnTaskLaunch="true" android:launchMode="singleInstance" - android:configChanges="screenLayout|keyboard|keyboardHidden|orientation" + android:configChanges="screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|orientation" android:visibleToInstantApps="true"> </activity> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-night/a11ymenu_intro.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-night/a11ymenu_intro.xml index b2a0b320cc0f..c2fe06a4353e 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-night/a11ymenu_intro.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-night/a11ymenu_intro.xml @@ -7,84 +7,67 @@ android:fillColor="#FF000000" android:pathData="M383.9,300H28.1c-15.5,0 -28.1,-12.6 -28.1,-28.1V28.1C0,12.6 12.6,0 28.1,0H383.9c15.5,0 28.1,12.6 28.1,28.1v243.8c0,15.5 -12.6,28.1 -28.1,28.1Z"/> <path - android:pathData="M106.4,0h195.3c2,0 3.6,0.2 3.6,0.4V31.2c0,0.2 -1.6,0.4 -3.6,0.4H106.4c-2,0 -3.6,-0.2 -3.6,-0.4V0.4c0,-0.2 1.6,-0.4 3.6,-0.4Z" - android:fillColor="#3b4043"/> - <path - android:pathData="M303.7,238.9H104.5v1h98.4v29.5h1v-29.5h99.8v-1Z" - android:fillColor="#3b4043"/> - <path - android:pathData="M153.7,258.3l0.7,-0.7 -2.7,-2.7h5.9v-1h-5.9l2.7,-2.7 -0.7,-0.7 -3.9,3.9 3.9,3.9Z" - android:fillColor="#3b4043" - android:fillType="evenOdd"/> - <path - android:pathData="M253.5,250.4l-0.7,0.7 2.7,2.7h-5.9v1h5.9l-2.7,2.7 0.7,0.7 3.9,-3.9 -3.9,-3.9Z" - android:fillColor="#7f868c" - android:fillType="evenOdd"/> - <path - android:pathData="M119.3,273h169.8c10.2,0 18.5,-8.3 18.5,-18.5V73.7c2,0 3.7,-1.7 3.7,-3.7V33.1c0,-2 -1.7,-3.7 -3.7,-3.7V0h-3.7V254.5c0,8.1 -6.6,14.8 -14.8,14.8H119.3c-8.1,0 -14.8,-6.6 -14.8,-14.8V0h-3.7V254.5c0,10.2 8.3,18.5 18.5,18.5Z" - android:fillColor="#80868b"/> - <path - android:pathData="M141.86,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#2197f3"/> <path - android:fillColor="#FF000000" - android:pathData="M141.86,81.15l-2.93,-2.93h-4.39c-0.39,0 -0.73,-0.15 -1.02,-0.44 -0.29,-0.29 -0.44,-0.63 -0.44,-1.02v-14.63c0,-0.39 0.15,-0.73 0.44,-1.02 0.29,-0.29 0.63,-0.44 1.02,-0.44h14.63c0.39,0 0.73,0.15 1.02,0.44 0.29,0.29 0.44,0.63 0.44,1.02v14.63c0,0.39 -0.15,0.73 -0.44,1.02 -0.29,0.29 -0.63,0.44 -1.02,0.44h-4.39l-2.93,2.93ZM141.88,74l1.37,-3.12 3.12,-1.37 -3.12,-1.37 -1.37,-3.12 -1.39,3.12 -3.1,1.37 3.1,1.37 1.39,3.12Z"/> - <path - android:pathData="M270.14,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#dbdce0"/> <path android:fillColor="#FF000000" - android:pathData="M269.25,62.01h1.77v8.74h-1.77v-8.74ZM274.01,65.22l1.22,-1.22c1.66,1.44 2.76,3.54 2.76,5.97 0,4.31 -3.54,7.85 -7.85,7.85s-7.85,-3.54 -7.85,-7.85c0,-2.43 1.11,-4.53 2.76,-5.97l1.22,1.22c-1.33,1.11 -2.21,2.88 -2.21,4.76 0,3.43 2.76,6.19 6.19,6.19 3.43,0 6.19,-2.76 6.19,-6.19 -0.11,-1.99 -1.11,-3.65 -2.43,-4.76Z" + android:pathData="M291.5,52.4h2.39v11.81h-2.39v-11.81ZM297.93,56.74l1.64,-1.64c2.24,1.94 3.74,4.78 3.74,8.07 0,5.83 -4.78,10.61 -10.61,10.61s-10.61,-4.78 -10.61,-10.61c0,-3.29 1.49,-6.13 3.74,-8.07l1.64,1.64c-1.79,1.49 -2.99,3.89 -2.99,6.43 0,4.63 3.74,8.37 8.37,8.37 4.63,0 8.37,-3.74 8.37,-8.37 -0.15,-2.69 -1.49,-4.93 -3.29,-6.43Z" android:fillType="evenOdd"/> <path - android:pathData="M207.03,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#d9affd"/> <path android:fillColor="#FF000000" - android:pathData="M207.03,62.6c-0.44,0 -0.81,-0.16 -1.13,-0.47 -0.31,-0.31 -0.47,-0.69 -0.47,-1.13s0.16,-0.81 0.47,-1.13c0.31,-0.31 0.69,-0.47 1.13,-0.47s0.81,0.16 1.13,0.47c0.31,0.31 0.47,0.69 0.47,1.13s-0.16,0.81 -0.47,1.13 -0.69,0.47 -1.13,0.47ZM204.75,76.06v-10.83c-0.92,-0.07 -1.85,-0.18 -2.78,-0.32 -0.94,-0.14 -1.8,-0.31 -2.61,-0.52l0.33,-1.31c1.17,0.29 2.37,0.5 3.61,0.64 1.23,0.13 2.48,0.2 3.74,0.2s2.5,-0.07 3.74,-0.2c1.23,-0.13 2.44,-0.34 3.61,-0.64l0.33,1.31c-0.8,0.2 -1.67,0.38 -2.61,0.52 -0.94,0.14 -1.86,0.24 -2.78,0.32v10.83h-1.31v-5.35h-1.93v5.35h-1.31ZM203.45,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23ZM207.05,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23ZM210.64,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23Z"/> + android:pathData="M207.39,53.2c-0.59,0 -1.1,-0.21 -1.53,-0.64 -0.42,-0.42 -0.64,-0.93 -0.64,-1.53s0.21,-1.1 0.64,-1.53c0.42,-0.42 0.93,-0.64 1.53,-0.64s1.1,0.21 1.53,0.64c0.42,0.42 0.64,0.93 0.64,1.53s-0.21,1.1 -0.64,1.53 -0.93,0.64 -1.53,0.64ZM204.31,71.39v-14.63c-1.24,-0.1 -2.5,-0.24 -3.76,-0.43 -1.26,-0.19 -2.44,-0.42 -3.53,-0.7l0.44,-1.78c1.58,0.39 3.2,0.68 4.87,0.86 1.67,0.18 3.35,0.27 5.05,0.27s3.38,-0.09 5.05,-0.27c1.67,-0.18 3.29,-0.46 4.87,-0.86l0.44,1.78c-1.09,0.28 -2.26,0.51 -3.53,0.7 -1.26,0.19 -2.52,0.33 -3.76,0.43v14.63h-1.78v-7.23h-2.61v7.23h-1.78ZM202.56,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31ZM207.42,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31ZM212.28,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31Z"/> <path - android:pathData="M141.86,180.81h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,212.98h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#fdd663"/> <path android:fillColor="#FF000000" - android:pathData="M141.88,209.09l-3.16,-3.06h-4.35v-4.35l-3.13,-3.13 3.13,-3.13v-4.35h4.35l3.16,-3.13 3.11,3.13h4.35v4.35l3.13,3.13 -3.13,3.13v4.35h-4.35l-3.11,3.06ZM141.88,203.08c-1.26,0 -2.34,-0.44 -3.23,-1.33 -0.89,-0.89 -1.33,-1.96 -1.33,-3.23s0.44,-2.34 1.33,-3.23c0.89,-0.89 1.96,-1.33 3.23,-1.33 1.26,0 2.34,0.44 3.23,1.33 0.89,0.89 1.33,1.96 1.33,3.23s-0.44,2.34 -1.33,3.23c-0.89,0.89 -1.96,1.33 -3.23,1.33ZM141.88,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91ZM141.88,207.12l2.53,-2.5h3.53v-3.53l2.55,-2.55 -2.55,-2.55v-3.53h-3.53l-2.53,-2.55 -2.57,2.55h-3.53v3.53l-2.55,2.55 2.55,2.55v3.53h3.51l2.6,2.5Z"/> + android:pathData="M119.34,251.2l-4.27,-4.14h-5.88v-5.88l-4.23,-4.23 4.23,-4.23v-5.88h5.88l4.27,-4.23 4.2,4.23h5.88v5.88l4.23,4.23 -4.23,4.23v5.88h-5.88l-4.2,4.14ZM119.34,243.08c-1.71,0 -3.16,-0.6 -4.36,-1.8 -1.2,-1.2 -1.8,-2.65 -1.8,-4.36s0.6,-3.16 1.8,-4.36c1.2,-1.2 2.65,-1.8 4.36,-1.8 1.71,0 3.16,0.6 4.36,1.8 1.2,1.2 1.8,2.65 1.8,4.36s-0.6,3.16 -1.8,4.36c-1.2,1.2 -2.65,1.8 -4.36,1.8ZM119.34,241.18c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23ZM119.34,248.55l3.41,-3.38h4.77v-4.77l3.44,-3.44 -3.44,-3.44v-4.77h-4.77l-3.41,-3.44 -3.48,3.44h-4.77v4.77l-3.44,3.44 3.44,3.44v4.77h4.74l3.51,3.38Z"/> <path - android:pathData="M207.03,180.82h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,212.99h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#fdd663"/> <path android:fillColor="#FF000000" - android:pathData="M207.05,209.09l-3.16,-3.06h-4.35v-4.35l-3.13,-3.13 3.13,-3.13v-4.35h4.35l3.16,-3.13 3.11,3.13h4.35v4.35l3.13,3.13 -3.13,3.13v4.35h-4.35l-3.11,3.06ZM207.05,203.08c1.26,0 2.34,-0.44 3.23,-1.33 0.89,-0.89 1.33,-1.96 1.33,-3.23s-0.44,-2.34 -1.33,-3.23c-0.89,-0.89 -1.96,-1.33 -3.23,-1.33 -1.26,0 -2.34,0.44 -3.23,1.33 -0.89,0.89 -1.33,1.96 -1.33,3.23s0.44,2.34 1.33,3.23c0.89,0.89 1.96,1.33 3.23,1.33ZM207.05,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91ZM207.05,207.13l2.53,-2.5h3.53v-3.53l2.55,-2.55 -2.55,-2.55v-3.53h-3.53l-2.53,-2.55 -2.57,2.55h-3.53v3.53l-2.55,2.55 2.55,2.55v3.53h3.51l2.6,2.5ZM207.05,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91Z"/> + android:pathData="M207.42,251.21l-4.27,-4.14h-5.88v-5.88l-4.23,-4.23 4.23,-4.23v-5.88h5.88l4.27,-4.23 4.2,4.23h5.88v5.88l4.23,4.23 -4.23,4.23v5.88h-5.88l-4.2,4.14ZM207.42,243.09c1.71,0 3.16,-0.6 4.36,-1.8 1.2,-1.2 1.8,-2.65 1.8,-4.36s-0.6,-3.16 -1.8,-4.36c-1.2,-1.2 -2.65,-1.8 -4.36,-1.8 -1.71,0 -3.16,0.6 -4.36,1.8 -1.2,1.2 -1.8,2.65 -1.8,4.36s0.6,3.16 1.8,4.36c1.2,1.2 2.65,1.8 4.36,1.8ZM207.42,241.19c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23ZM207.42,248.55l3.41,-3.38h4.77v-4.77l3.44,-3.44 -3.44,-3.44v-4.77h-4.77l-3.41,-3.44 -3.48,3.44h-4.77v4.77l-3.44,3.44 3.44,3.44v4.77h4.74l3.51,3.38ZM207.42,241.19c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23Z"/> <path - android:pathData="M270.14,180.81h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,212.98h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#84e39f"/> <path android:fillColor="#FF000000" - android:pathData="M263.92,207.44c-0.4,0 -0.74,-0.14 -1.02,-0.42s-0.42,-0.62 -0.42,-1.02v-10.37c0,-0.4 0.14,-0.74 0.42,-1.02s0.62,-0.42 1.02,-0.42h1.67v-2.29c0,-1.26 0.44,-2.33 1.33,-3.22 0.88,-0.88 1.96,-1.33 3.22,-1.33s2.33,0.44 3.22,1.33c0.88,0.88 1.33,1.96 1.33,3.22v2.29h1.67c0.4,0 0.74,0.14 1.02,0.42s0.42,0.62 0.42,1.02v10.37c0,0.4 -0.14,0.74 -0.42,1.02s-0.62,0.42 -1.02,0.42h-12.43ZM263.92,206.01h12.43v-10.37h-12.43v10.37ZM270.14,202.66c0.51,0 0.94,-0.18 1.3,-0.53s0.54,-0.77 0.54,-1.27c0,-0.48 -0.18,-0.91 -0.54,-1.3s-0.79,-0.59 -1.3,-0.59 -0.94,0.2 -1.3,0.59c-0.36,0.39 -0.54,0.82 -0.54,1.3 0,0.49 0.18,0.92 0.54,1.27s0.79,0.53 1.3,0.53ZM267.03,194.2h6.22v-2.29c0,-0.86 -0.3,-1.59 -0.91,-2.2 -0.61,-0.61 -1.34,-0.91 -2.2,-0.91s-1.59,0.3 -2.2,0.91 -0.91,1.34 -0.91,2.2v2.29ZM263.92,206.01v0Z"/> + android:pathData="M284.29,248.97c-0.54,0 -1,-0.19 -1.37,-0.57s-0.57,-0.83 -0.57,-1.37v-14.02c0,-0.54 0.19,-1 0.57,-1.37s0.83,-0.57 1.37,-0.57h2.26v-3.1c0,-1.7 0.6,-3.15 1.79,-4.35 1.2,-1.2 2.64,-1.79 4.35,-1.79s3.15,0.6 4.35,1.79c1.2,1.2 1.79,2.64 1.79,4.35v3.1h2.26c0.54,0 1,0.19 1.37,0.57s0.57,0.83 0.57,1.37v14.02c0,0.54 -0.19,1 -0.57,1.37s-0.83,0.57 -1.37,0.57h-16.8ZM284.29,247.03h16.8v-14.02h-16.8v14.02ZM292.7,242.51c0.69,0 1.28,-0.24 1.76,-0.71s0.73,-1.04 0.73,-1.71c0,-0.65 -0.24,-1.23 -0.73,-1.76s-1.07,-0.79 -1.76,-0.79 -1.28,0.26 -1.76,0.79c-0.48,0.53 -0.73,1.11 -0.73,1.76 0,0.67 0.24,1.24 0.73,1.71s1.07,0.71 1.76,0.71ZM288.5,231.07h8.4v-3.1c0,-1.16 -0.41,-2.15 -1.23,-2.97 -0.82,-0.82 -1.81,-1.23 -2.97,-1.23s-2.15,0.41 -2.97,1.23 -1.23,1.81 -1.23,2.97v3.1ZM284.29,247.03v0Z"/> <path - android:pathData="M207.03,116.5h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,126.06h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#7ae2d4"/> <path android:fillColor="#FF000000" - android:pathData="M209.17,143.6v-1.66c1.73,-0.5 3.15,-1.46 4.25,-2.88 1.1,-1.42 1.65,-3.03 1.65,-4.84 0,-1.8 -0.54,-3.42 -1.63,-4.85s-2.51,-2.38 -4.26,-2.87v-1.66c2.22,0.5 4.02,1.62 5.41,3.36 1.39,1.74 2.09,3.75 2.09,6.02s-0.7,4.27 -2.09,6.02c-1.39,1.74 -3.2,2.86 -5.41,3.36ZM197.38,137.46v-6.43h4.29l5.36,-5.36v17.15l-5.36,-5.36h-4.29ZM208.63,138.75v-9.03c0.98,0.3 1.76,0.88 2.34,1.71 0.58,0.84 0.87,1.78 0.87,2.81 0,1.02 -0.29,1.95 -0.88,2.79s-1.37,1.41 -2.33,1.71ZM205.42,129.75l-3.03,2.89h-3.4v3.22h3.4l3.03,2.92v-9.03Z"/> + android:pathData="M210.29,162.68v-2.25c2.34,-0.68 4.26,-1.97 5.74,-3.89 1.49,-1.92 2.23,-4.1 2.23,-6.54 0,-2.44 -0.74,-4.62 -2.21,-6.56 -1.47,-1.93 -3.39,-3.22 -5.76,-3.88v-2.25c2.99,0.68 5.43,2.19 7.32,4.55 1.88,2.35 2.83,5.06 2.83,8.13s-0.94,5.78 -2.83,8.13c-1.88,2.35 -4.32,3.87 -7.32,4.55ZM194.35,154.39v-8.69h5.8l7.24,-7.24v23.18l-7.24,-7.24h-5.8ZM209.56,156.13v-12.21c1.33,0.41 2.38,1.18 3.17,2.32 0.78,1.13 1.18,2.4 1.18,3.8 0,1.38 -0.4,2.63 -1.2,3.77s-1.85,1.91 -3.15,2.32ZM205.21,143.96l-4.09,3.91h-4.6v4.35h4.6l4.09,3.95v-12.21Z"/> <path - android:pathData="M270.14,116.54h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,126.1h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#efa5de"/> <path android:fillColor="#FF000000" - android:pathData="M275.08,127.12h-9.89v14.23h9.89v-14.23Z"/> + android:pathData="M299.38,140.4h-13.36v19.23h13.36v-19.23Z"/> <path android:fillColor="#FF000000" - android:pathData="M263.88,129.91h-3.56v8.76h3.56v-8.76Z"/> + android:pathData="M284.23,144.18h-4.81v11.84h4.81v-11.84Z"/> <path android:fillColor="#FF000000" - android:pathData="M279.96,129.91h-3.56v8.76h3.56v-8.76Z"/> + android:pathData="M305.97,144.18h-4.81v11.84h4.81v-11.84Z"/> <path - android:pathData="M267.04,128.82h6.21v10.83h-6.21z" + android:pathData="M288.5,142.7h8.39v14.63h-8.39z" android:fillColor="#efa5de"/> <path - android:pathData="M141.86,116.5h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,126.06h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#7ae2d4"/> <path android:fillColor="#FF000000" - android:pathData="M134.62,137.44v-6.43h4.29l5.36,-5.36v17.16l-5.36,-5.36h-4.29ZM145.88,138.73v-9.03c0.97,0.3 1.74,0.88 2.33,1.72 0.59,0.84 0.88,1.78 0.88,2.81 0,1.05 -0.29,1.99 -0.88,2.81s-1.37,1.39 -2.33,1.69ZM142.66,129.72l-3.03,2.9h-3.4v3.22h3.4l3.03,2.92v-9.03Z"/> + android:pathData="M109.52,154.35v-8.7h5.8l7.25,-7.25v23.19l-7.25,-7.25h-5.8ZM124.74,156.09v-12.21c1.3,0.41 2.36,1.18 3.15,2.32 0.8,1.14 1.2,2.4 1.2,3.8 0,1.43 -0.4,2.69 -1.2,3.8s-1.85,1.87 -3.15,2.28ZM120.39,143.92l-4.09,3.91h-4.6v4.35h4.6l4.09,3.95v-12.21Z"/> + <path + android:fillColor="#FF000000" + android:pathData="M119.09,78.27l-3.9,-4.01 -5.93,-0.08c-0.53,-0.01 -0.99,-0.21 -1.38,-0.61 -0.39,-0.4 -0.58,-0.86 -0.57,-1.39l0.26,-19.77c0.01,-0.53 0.21,-0.99 0.61,-1.38 0.4,-0.39 0.86,-0.58 1.39,-0.57l19.77,0.26c0.53,0.01 0.99,0.21 1.38,0.61 0.39,0.4 0.58,0.86 0.57,1.39l-0.26,19.77c-0.01,0.53 -0.21,0.99 -0.61,1.38 -0.4,0.39 -0.86,0.58 -1.39,0.57l-5.93,-0.08 -4.01,3.9ZM119.25,68.61l1.9,-4.19 4.24,-1.79 -4.19,-1.9 -1.79,-4.24 -1.93,4.19 -4.21,1.79 4.16,1.9 1.82,4.24Z"/> </vector> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp-night/a11ymenu_intro.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp-night/a11ymenu_intro.xml deleted file mode 100644 index cb2e9745132b..000000000000 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp-night/a11ymenu_intro.xml +++ /dev/null @@ -1,106 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="412dp" - android:height="300dp" - android:viewportWidth="412" - android:viewportHeight="300"> - <path - android:fillColor="#FF000000" - android:pathData="M199.88,53.03l-2.73,-2.73h-4.09c-0.36,0 -0.68,-0.14 -0.95,-0.41 -0.27,-0.27 -0.41,-0.59 -0.41,-0.95v-13.64c0,-0.36 0.14,-0.68 0.41,-0.95 0.27,-0.27 0.59,-0.41 0.95,-0.41h13.64c0.36,0 0.68,0.14 0.95,0.41 0.27,0.27 0.41,0.59 0.41,0.95v13.64c0,0.36 -0.14,0.68 -0.41,0.95 -0.27,0.27 -0.59,0.41 -0.95,0.41h-4.09l-2.73,2.73ZM199.9,46.37l1.27,-2.91 2.91,-1.27 -2.91,-1.27 -1.27,-2.91 -1.3,2.91 -2.89,1.27 2.89,1.27 1.3,2.91Z"/> - <path - android:fillColor="#FF000000" - android:pathData="M384.18,300H27.82c-15.29,0 -27.82,-12.83 -27.82,-28.48V28.48C0,12.83 12.53,0 27.82,0H384.29c15.18,0 27.71,12.83 27.71,28.48v243.15c0,15.54 -12.53,28.37 -27.82,28.37Z"/> - <path - android:pathData="M207.19,52.65h151.18c4.14,0 7.51,3.36 7.51,7.51V243.15c0,4.14 -3.36,7.51 -7.51,7.51H207.19V52.65h0Z" - android:fillColor="#5f6368"/> - <path - android:pathData="M368.24,143.47L368.24,60.55c0,-5.67 -4.59,-10.26 -10.26,-10.26L54.02,50.29c-5.67,0 -10.26,4.59 -10.26,10.26L43.76,242.76c0,5.67 4.59,10.26 10.26,10.26L357.98,253.02c5.67,0 10.26,-4.59 10.26,-10.26v-99.29ZM365.88,243.14c0,4.15 -3.75,7.52 -7.9,7.52L54.02,250.66c-4.15,0 -7.9,-3.37 -7.9,-7.52L46.12,60.55c0,-4.15 3.75,-7.9 7.9,-7.9L357.98,52.65c4.15,0 7.9,3.75 7.9,7.9L365.88,243.14Z" - android:fillColor="#80868b"/> - <path - android:pathData="M319.83,50.29c-0,-1.28 -1.04,-2.31 -2.31,-2.31h-23.11c-1.28,0 -2.31,1.03 -2.31,2.31h27.74Z" - android:fillColor="#80868b"/> - <path - android:pathData="M344.42,50.29c-0,-1.28 -1.03,-2.31 -2.31,-2.31h-9.25c-1.28,0 -2.31,1.03 -2.31,2.31h13.87Z" - android:fillColor="#80868b"/> - <path - android:pathData="M86.06,240.43l0.7,-0.7 -2.7,-2.7h5.9v-1h-5.9l2.7,-2.7 -0.7,-0.7 -3.9,3.9 3.9,3.9Z" - android:fillColor="#5f6368" - android:fillType="evenOdd"/> - <path - android:pathData="M166.93,232.89l-0.7,0.7 2.7,2.7h-5.9v1h5.9l-2.7,2.7 0.7,0.7 3.9,-3.9 -3.9,-3.9Z" - android:fillColor="#7f868c" - android:fillType="evenOdd"/> - <path - android:strokeWidth="1" - android:pathData="M46.12,222.93L207.19,222.93" - android:fillColor="#00000000" - android:strokeColor="#5f6368"/> - <path - android:strokeWidth="1" - android:pathData="M126.66,222.93L126.66,250.66" - android:fillColor="#00000000" - android:strokeColor="#5f6368"/> - <path - android:pathData="M78.55,70.3h0c8.84,0 16,7.16 16,16h0c0,8.84 -7.16,16 -16,16h0c-8.84,0 -16,-7.16 -16,-16h0c0,-8.84 7.16,-16 16,-16Z" - android:fillColor="#2197f3"/> - <path - android:pathData="M78.55,174.3h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#fdd663"/> - <path - android:fillColor="#FF000000" - android:pathData="M78.57,199.86l-2.85,-2.77h-3.93v-3.93l-2.83,-2.83 2.83,-2.83v-3.93h3.93l2.85,-2.83 2.81,2.83h3.93v3.93l2.83,2.83 -2.83,2.83v3.93h-3.93l-2.81,2.77ZM78.57,194.43c-1.14,0 -2.11,-0.4 -2.92,-1.2 -0.8,-0.8 -1.2,-1.78 -1.2,-2.92s0.4,-2.11 1.2,-2.92c0.8,-0.8 1.78,-1.2 2.92,-1.2 1.14,0 2.11,0.4 2.92,1.2 0.8,0.8 1.2,1.78 1.2,2.92s-0.4,2.11 -1.2,2.92c-0.8,0.8 -1.78,1.2 -2.92,1.2ZM78.57,193.16c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82ZM78.57,198.09l2.28,-2.26h3.19v-3.19l2.3,-2.3 -2.3,-2.3v-3.19h-3.19l-2.28,-2.3 -2.32,2.3h-3.19v3.19l-2.3,2.3 2.3,2.3v3.19h3.17l2.35,2.26Z"/> - <path - android:pathData="M126.55,174.31h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#fdd663"/> - <path - android:fillColor="#FF000000" - android:pathData="M126.58,199.87l-2.85,-2.77h-3.93v-3.93l-2.83,-2.83 2.83,-2.83v-3.93h3.93l2.85,-2.83 2.81,2.83h3.93v3.93l2.83,2.83 -2.83,2.83v3.93h-3.93l-2.81,2.77ZM126.58,194.44c1.14,0 2.11,-0.4 2.92,-1.2 0.8,-0.8 1.2,-1.78 1.2,-2.92s-0.4,-2.11 -1.2,-2.92c-0.8,-0.8 -1.78,-1.2 -2.92,-1.2 -1.14,0 -2.11,0.4 -2.92,1.2 -0.8,0.8 -1.2,1.78 -1.2,2.92s0.4,2.11 1.2,2.92c0.8,0.8 1.78,1.2 2.92,1.2ZM126.58,193.17c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82ZM126.58,198.09l2.28,-2.26h3.19v-3.19l2.3,-2.3 -2.3,-2.3v-3.19h-3.19l-2.28,-2.3 -2.32,2.3h-3.19v3.19l-2.3,2.3 2.3,2.3v3.19h3.17l2.35,2.26ZM126.58,193.17c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82Z"/> - <path - android:pathData="M174.56,174.3h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#84e39f"/> - <path - android:fillColor="#FF000000" - android:pathData="M168.94,198.37c-0.36,0 -0.67,-0.13 -0.92,-0.38s-0.38,-0.56 -0.38,-0.92v-9.38c0,-0.36 0.13,-0.67 0.38,-0.92s0.56,-0.38 0.92,-0.38h1.51v-2.07c0,-1.14 0.4,-2.11 1.2,-2.91 0.8,-0.8 1.77,-1.2 2.91,-1.2s2.11,0.4 2.91,1.2c0.8,0.8 1.2,1.77 1.2,2.91v2.07h1.51c0.36,0 0.67,0.13 0.92,0.38s0.38,0.56 0.38,0.92v9.38c0,0.36 -0.13,0.67 -0.38,0.92s-0.56,0.38 -0.92,0.38h-11.24ZM168.94,197.08h11.24v-9.38h-11.24v9.38ZM174.56,194.05c0.46,0 0.85,-0.16 1.18,-0.48s0.49,-0.7 0.49,-1.15c0,-0.43 -0.16,-0.82 -0.49,-1.18s-0.72,-0.53 -1.18,-0.53 -0.85,0.18 -1.18,0.53c-0.32,0.35 -0.49,0.75 -0.49,1.18 0,0.45 0.16,0.83 0.49,1.15s0.72,0.48 1.18,0.48ZM171.75,186.4h5.62v-2.07c0,-0.78 -0.27,-1.44 -0.82,-1.99 -0.55,-0.55 -1.21,-0.82 -1.99,-0.82s-1.44,0.27 -1.99,0.82 -0.82,1.21 -0.82,1.99v2.07ZM168.94,197.08v0Z"/> - <path - android:pathData="M174.56,70.24h0c8.87,0 16.06,7.19 16.06,16.06h0c0,8.87 -7.19,16.06 -16.06,16.06h0c-8.87,0 -16.06,-7.19 -16.06,-16.06h0c0,-8.87 7.19,-16.06 16.06,-16.06Z" - android:fillColor="#dbdce0"/> - <path - android:fillColor="#FF000000" - android:pathData="M173.75,79.12h1.61v7.93h-1.61v-7.93ZM178.07,82.03l1.1,-1.1c1.51,1.31 2.51,3.21 2.51,5.42 0,3.92 -3.21,7.13 -7.13,7.13s-7.13,-3.21 -7.13,-7.13c0,-2.21 1,-4.12 2.51,-5.42l1.1,1.1c-1.2,1 -2.01,2.61 -2.01,4.32 0,3.11 2.51,5.62 5.62,5.62 3.11,0 5.62,-2.51 5.62,-5.62 -0.1,-1.81 -1,-3.31 -2.21,-4.32Z" - android:fillType="evenOdd"/> - <path - android:pathData="M126.55,70.24h0c8.87,0 16.06,7.19 16.06,16.06h0c0,8.87 -7.19,16.06 -16.06,16.06h0c-8.87,0 -16.06,-7.19 -16.06,-16.06h0c0,-8.87 7.19,-16.06 16.06,-16.06Z" - android:fillColor="#d9affd"/> - <path - android:fillColor="#FF000000" - android:pathData="M126.55,79.66c-0.4,0 -0.74,-0.14 -1.02,-0.43 -0.29,-0.29 -0.43,-0.63 -0.43,-1.02s0.14,-0.74 0.43,-1.02c0.29,-0.29 0.63,-0.43 1.02,-0.43s0.74,0.14 1.02,0.43c0.29,0.29 0.43,0.63 0.43,1.02s-0.14,0.74 -0.43,1.02 -0.63,0.43 -1.02,0.43ZM124.49,91.87v-9.83c-0.84,-0.07 -1.68,-0.16 -2.53,-0.29 -0.85,-0.13 -1.64,-0.28 -2.37,-0.47l0.3,-1.19c1.06,0.27 2.15,0.46 3.27,0.58 1.12,0.12 2.25,0.18 3.39,0.18s2.27,-0.06 3.39,-0.18c1.12,-0.12 2.21,-0.31 3.27,-0.58l0.3,1.19c-0.73,0.19 -1.52,0.34 -2.37,0.47 -0.85,0.13 -1.69,0.22 -2.53,0.29v9.83h-1.19v-4.85h-1.75v4.85h-1.19ZM123.31,95.85c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21ZM126.57,95.85c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21ZM129.84,95.85c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21Z"/> - <path - android:pathData="M126.55,122.3h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#7ae2d4"/> - <path - android:fillColor="#FF000000" - android:pathData="M128.49,146.78v-1.5c1.57,-0.45 2.84,-1.32 3.84,-2.6 0.99,-1.28 1.49,-2.74 1.49,-4.37 0,-1.63 -0.49,-3.09 -1.48,-4.38s-2.27,-2.15 -3.85,-2.59v-1.5c2,0.45 3.63,1.46 4.89,3.04 1.26,1.57 1.89,3.39 1.89,5.43s-0.63,3.86 -1.89,5.43c-1.26,1.57 -2.89,2.59 -4.89,3.04ZM117.84,141.24v-5.81h3.87l4.84,-4.84v15.49l-4.84,-4.84h-3.87ZM128.01,142.4v-8.16c0.89,0.27 1.59,0.79 2.12,1.55 0.52,0.76 0.79,1.61 0.79,2.54 0,0.92 -0.27,1.76 -0.8,2.52s-1.23,1.28 -2.11,1.55ZM125.1,134.26l-2.74,2.61h-3.07v2.91h3.07l2.74,2.64v-8.16Z"/> - <path - android:pathData="M174.56,122.33h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#efa5de"/> - <path - android:fillColor="#FF000000" - android:pathData="M179.02,131.89h-8.93v12.86h8.93v-12.86Z"/> - <path - android:fillColor="#FF000000" - android:pathData="M168.9,134.41h-3.22v7.91h3.22v-7.91Z"/> - <path - android:fillColor="#FF000000" - android:pathData="M183.43,134.41h-3.22v7.91h3.22v-7.91Z"/> - <path - android:pathData="M171.75,133.42h5.61v9.78h-5.61z" - android:fillColor="#efa5de"/> - <path - android:pathData="M78.55,122.3h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#7ae2d4"/> - <path - android:fillColor="#FF000000" - android:pathData="M72.01,141.21v-5.81h3.88l4.84,-4.84v15.5l-4.84,-4.84h-3.88ZM82.18,142.38v-8.16c0.87,0.27 1.57,0.79 2.11,1.55 0.53,0.76 0.8,1.61 0.8,2.54 0,0.95 -0.27,1.8 -0.8,2.54 -0.53,0.74 -1.24,1.25 -2.11,1.53ZM79.28,134.24l-2.74,2.62h-3.08v2.91h3.08l2.74,2.64v-8.16Z"/> - <path - android:fillColor="#FF000000" - android:pathData="M78.73,96.45l-2.73,-2.73h-4.09c-0.36,0 -0.68,-0.14 -0.95,-0.41 -0.27,-0.27 -0.41,-0.59 -0.41,-0.95v-13.64c0,-0.36 0.14,-0.68 0.41,-0.95 0.27,-0.27 0.59,-0.41 0.95,-0.41h13.64c0.36,0 0.68,0.14 0.95,0.41 0.27,0.27 0.41,0.59 0.41,0.95v13.64c0,0.36 -0.14,0.68 -0.41,0.95 -0.27,0.27 -0.59,0.41 -0.95,0.41h-4.09l-2.73,2.73ZM78.75,89.79l1.27,-2.91 2.91,-1.27 -2.91,-1.27 -1.27,-2.91 -1.3,2.91 -2.89,1.27 2.89,1.27 1.3,2.91Z"/> -</vector> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp/a11ymenu_intro.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp/a11ymenu_intro.xml deleted file mode 100644 index aba9581894a6..000000000000 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable-sw600dp/a11ymenu_intro.xml +++ /dev/null @@ -1,103 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="412dp" - android:height="300dp" - android:viewportWidth="412" - android:viewportHeight="300"> - <path - android:pathData="M384.18,300H27.82c-15.29,0 -27.82,-12.83 -27.82,-28.48V28.48C0,12.83 12.53,0 27.82,0H384.29c15.18,0 27.71,12.83 27.71,28.48v243.15c0,15.54 -12.53,28.37 -27.82,28.37Z" - android:fillColor="#fff"/> - <path - android:pathData="M78.71,69.91h0c8.84,0 16,7.16 16,16h0c0,8.84 -7.16,16 -16,16h0c-8.84,0 -16,-7.16 -16,-16h0c0,-8.84 7.16,-16 16,-16Z" - android:fillColor="#2197f3"/> - <path - android:pathData="M207.35,52.26h151.18c4.14,0 7.51,3.36 7.51,7.51V242.76c0,4.14 -3.36,7.51 -7.51,7.51H207.35V52.26h0Z" - android:fillColor="#e8eaed"/> - <path - android:pathData="M368.4,143.08L368.4,60.16c0,-5.67 -4.59,-10.26 -10.26,-10.26L54.17,49.9c-5.67,0 -10.26,4.59 -10.26,10.26L43.91,242.37c0,5.67 4.59,10.26 10.26,10.26L358.14,252.63c5.67,0 10.26,-4.59 10.26,-10.26v-99.29ZM366.04,242.75c0,4.15 -3.75,7.52 -7.9,7.52L54.17,250.27c-4.15,0 -7.9,-3.37 -7.9,-7.52L46.27,60.16c0,-4.15 3.75,-7.9 7.9,-7.9L358.14,52.26c4.15,0 7.9,3.75 7.9,7.9L366.04,242.75Z" - android:fillColor="#dadce0"/> - <path - android:pathData="M319.98,49.9c-0,-1.28 -1.04,-2.31 -2.31,-2.31h-23.11c-1.28,0 -2.31,1.03 -2.31,2.31h27.74Z" - android:fillColor="#dadce0"/> - <path - android:pathData="M344.57,49.9c-0,-1.28 -1.03,-2.31 -2.31,-2.31h-9.25c-1.28,0 -2.31,1.03 -2.31,2.31h13.87Z" - android:fillColor="#dadce0"/> - <path - android:pathData="M86.21,240.04l0.7,-0.7 -2.7,-2.7h5.9v-1h-5.9l2.7,-2.7 -0.7,-0.7 -3.9,3.9 3.9,3.9Z" - android:fillColor="#e8eaed" - android:fillType="evenOdd"/> - <path - android:pathData="M167.08,232.5l-0.7,0.7 2.7,2.7h-5.9v1h5.9l-2.7,2.7 0.7,0.7 3.9,-3.9 -3.9,-3.9Z" - android:fillColor="#7f868c" - android:fillType="evenOdd"/> - <path - android:strokeWidth="1" - android:pathData="M46.27,222.54L207.35,222.54" - android:fillColor="#00000000" - android:strokeColor="#e8eaed"/> - <path - android:strokeWidth="1" - android:pathData="M126.81,222.54L126.81,250.27" - android:fillColor="#00000000" - android:strokeColor="#e8eaed"/> - <path - android:pathData="M78.71,173.91h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#de9834"/> - <path - android:pathData="M78.73,199.47l-2.85,-2.77h-3.93v-3.93l-2.83,-2.83 2.83,-2.83v-3.93h3.93l2.85,-2.83 2.81,2.83h3.93v3.93l2.83,2.83 -2.83,2.83v3.93h-3.93l-2.81,2.77ZM78.73,194.04c-1.14,0 -2.11,-0.4 -2.92,-1.2 -0.8,-0.8 -1.2,-1.78 -1.2,-2.92s0.4,-2.11 1.2,-2.92c0.8,-0.8 1.78,-1.2 2.92,-1.2 1.14,0 2.11,0.4 2.92,1.2 0.8,0.8 1.2,1.78 1.2,2.92s-0.4,2.11 -1.2,2.92c-0.8,0.8 -1.78,1.2 -2.92,1.2ZM78.73,192.77c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82ZM78.73,197.7l2.28,-2.26h3.19v-3.19l2.3,-2.3 -2.3,-2.3v-3.19h-3.19l-2.28,-2.3 -2.32,2.3h-3.19v3.19l-2.3,2.3 2.3,2.3v3.19h3.17l2.35,2.26Z" - android:fillColor="#fff"/> - <path - android:pathData="M126.71,173.92h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#de9834"/> - <path - android:pathData="M126.73,199.48l-2.85,-2.77h-3.93v-3.93l-2.83,-2.83 2.83,-2.83v-3.93h3.93l2.85,-2.83 2.81,2.83h3.93v3.93l2.83,2.83 -2.83,2.83v3.93h-3.93l-2.81,2.77ZM126.73,194.04c1.14,0 2.11,-0.4 2.92,-1.2 0.8,-0.8 1.2,-1.78 1.2,-2.92s-0.4,-2.11 -1.2,-2.92c-0.8,-0.8 -1.78,-1.2 -2.92,-1.2 -1.14,0 -2.11,0.4 -2.92,1.2 -0.8,0.8 -1.2,1.78 -1.2,2.92s0.4,2.11 1.2,2.92c0.8,0.8 1.78,1.2 2.92,1.2ZM126.73,192.78c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82ZM126.73,197.7l2.28,-2.26h3.19v-3.19l2.3,-2.3 -2.3,-2.3v-3.19h-3.19l-2.28,-2.3 -2.32,2.3h-3.19v3.19l-2.3,2.3 2.3,2.3v3.19h3.17l2.35,2.26ZM126.73,192.78c0.8,0 1.48,-0.27 2.03,-0.82 0.55,-0.55 0.82,-1.23 0.82,-2.03 -0,-0.8 -0.27,-1.48 -0.82,-2.03 -0.55,-0.55 -1.23,-0.82 -2.03,-0.82 -0.8,0 -1.48,0.27 -2.03,0.82 -0.55,0.55 -0.82,1.23 -0.82,2.03s0.27,1.48 0.82,2.03c0.55,0.55 1.23,0.82 2.03,0.82Z" - android:fillColor="#fff"/> - <path - android:pathData="M174.71,173.91h0c8.83,0 16,7.16 16,16h0c0,8.83 -7.16,16 -16,16h0c-8.83,0 -16,-7.16 -16,-16h0c0,-8.83 7.16,-16 16,-16Z" - android:fillColor="#438947"/> - <path - android:pathData="M169.09,197.98c-0.36,0 -0.67,-0.13 -0.92,-0.38s-0.38,-0.56 -0.38,-0.92v-9.38c0,-0.36 0.13,-0.67 0.38,-0.92s0.56,-0.38 0.92,-0.38h1.51v-2.07c0,-1.14 0.4,-2.11 1.2,-2.91 0.8,-0.8 1.77,-1.2 2.91,-1.2s2.11,0.4 2.91,1.2c0.8,0.8 1.2,1.77 1.2,2.91v2.07h1.51c0.36,0 0.67,0.13 0.92,0.38s0.38,0.56 0.38,0.92v9.38c0,0.36 -0.13,0.67 -0.38,0.92s-0.56,0.38 -0.92,0.38h-11.24ZM169.09,196.68h11.24v-9.38h-11.24v9.38ZM174.71,193.66c0.46,0 0.85,-0.16 1.18,-0.48s0.49,-0.7 0.49,-1.15c0,-0.43 -0.16,-0.82 -0.49,-1.18s-0.72,-0.53 -1.18,-0.53 -0.85,0.18 -1.18,0.53c-0.32,0.35 -0.49,0.75 -0.49,1.18 0,0.45 0.16,0.83 0.49,1.15s0.72,0.48 1.18,0.48ZM171.9,186.01h5.62v-2.07c0,-0.78 -0.27,-1.44 -0.82,-1.99 -0.55,-0.55 -1.21,-0.82 -1.99,-0.82s-1.44,0.27 -1.99,0.82 -0.82,1.21 -0.82,1.99v2.07ZM169.09,196.68v0Z" - android:fillColor="#fff"/> - <path - android:pathData="M174.71,69.85h0c8.87,0 16.06,7.19 16.06,16.06h0c0,8.87 -7.19,16.06 -16.06,16.06h0c-8.87,0 -16.06,-7.19 -16.06,-16.06h0c0,-8.87 7.19,-16.06 16.06,-16.06Z" - android:fillColor="#80868b"/> - <path - android:pathData="M173.91,78.73h1.61v7.93h-1.61v-7.93ZM178.22,81.64l1.1,-1.1c1.51,1.31 2.51,3.21 2.51,5.42 0,3.92 -3.21,7.13 -7.13,7.13s-7.13,-3.21 -7.13,-7.13c0,-2.21 1,-4.12 2.51,-5.42l1.1,1.1c-1.2,1 -2.01,2.61 -2.01,4.32 0,3.11 2.51,5.62 5.62,5.62 3.11,0 5.62,-2.51 5.62,-5.62 -0.1,-1.81 -1,-3.31 -2.21,-4.32Z" - android:fillColor="#fff" - android:fillType="evenOdd"/> - <path - android:pathData="M126.71,69.85h0c8.87,0 16.06,7.19 16.06,16.06h0c0,8.87 -7.19,16.06 -16.06,16.06h0c-8.87,0 -16.06,-7.19 -16.06,-16.06h0c0,-8.87 7.19,-16.06 16.06,-16.06Z" - android:fillColor="#521bbf"/> - <path - android:pathData="M126.71,79.26c-0.4,0 -0.74,-0.14 -1.02,-0.43 -0.29,-0.29 -0.43,-0.63 -0.43,-1.02s0.14,-0.74 0.43,-1.02c0.29,-0.29 0.63,-0.43 1.02,-0.43s0.74,0.14 1.02,0.43c0.29,0.29 0.43,0.63 0.43,1.02s-0.14,0.74 -0.43,1.02 -0.63,0.43 -1.02,0.43ZM124.64,91.48v-9.83c-0.84,-0.07 -1.68,-0.16 -2.53,-0.29 -0.85,-0.13 -1.64,-0.28 -2.37,-0.47l0.3,-1.19c1.06,0.27 2.15,0.46 3.27,0.58 1.12,0.12 2.25,0.18 3.39,0.18s2.27,-0.06 3.39,-0.18c1.12,-0.12 2.21,-0.31 3.27,-0.58l0.3,1.19c-0.73,0.19 -1.52,0.34 -2.37,0.47 -0.85,0.13 -1.69,0.22 -2.53,0.29v9.83h-1.19v-4.85h-1.75v4.85h-1.19ZM123.47,95.46c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21ZM126.73,95.46c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21ZM129.99,95.46c-0.23,0 -0.41,-0.07 -0.55,-0.21 -0.14,-0.14 -0.21,-0.32 -0.21,-0.55 0,-0.23 0.07,-0.41 0.21,-0.55 0.14,-0.14 0.32,-0.21 0.55,-0.21s0.41,0.07 0.55,0.21c0.14,0.14 0.21,0.32 0.21,0.55 0,0.23 -0.07,0.41 -0.21,0.55 -0.14,0.14 -0.32,0.21 -0.55,0.21Z" - android:fillColor="#fff"/> - <path - android:pathData="M126.71,121.91h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#327969"/> - <path - android:pathData="M128.65,146.39v-1.5c1.57,-0.45 2.84,-1.32 3.84,-2.6 0.99,-1.28 1.49,-2.74 1.49,-4.37 0,-1.63 -0.49,-3.09 -1.48,-4.38s-2.27,-2.15 -3.85,-2.59v-1.5c2,0.45 3.63,1.46 4.89,3.04 1.26,1.57 1.89,3.39 1.89,5.43s-0.63,3.86 -1.89,5.43c-1.26,1.57 -2.89,2.59 -4.89,3.04ZM117.99,140.84v-5.81h3.87l4.84,-4.84v15.49l-4.84,-4.84h-3.87ZM128.16,142.01v-8.16c0.89,0.27 1.59,0.79 2.12,1.55 0.52,0.76 0.79,1.61 0.79,2.54 0,0.92 -0.27,1.76 -0.8,2.52s-1.23,1.28 -2.11,1.55ZM125.26,133.87l-2.74,2.61h-3.07v2.91h3.07l2.74,2.64v-8.16Z" - android:fillColor="#fff"/> - <path - android:pathData="M174.71,121.94h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#9f3ebf"/> - <path - android:pathData="M179.18,131.5h-8.93v12.86h8.93v-12.86Z" - android:fillColor="#fff"/> - <path - android:pathData="M169.05,134.02h-3.22v7.91h3.22v-7.91Z" - android:fillColor="#fff"/> - <path - android:pathData="M183.58,134.02h-3.22v7.91h3.22v-7.91Z" - android:fillColor="#fff"/> - <path - android:pathData="M171.91,133.03h5.61v9.78h-5.61z" - android:fillColor="#9f3ebf"/> - <path - android:pathData="M78.71,121.91h0c8.83,0 15.99,7.16 15.99,15.99h0c0,8.83 -7.16,15.99 -15.99,15.99h0c-8.83,0 -15.99,-7.16 -15.99,-15.99h0c0,-8.83 7.16,-15.99 15.99,-15.99Z" - android:fillColor="#327969"/> - <path - android:pathData="M72.17,140.82v-5.81h3.88l4.84,-4.84v15.5l-4.84,-4.84h-3.88ZM82.34,141.98v-8.16c0.87,0.27 1.57,0.79 2.11,1.55 0.53,0.76 0.8,1.61 0.8,2.54 0,0.95 -0.27,1.8 -0.8,2.54 -0.53,0.74 -1.24,1.25 -2.11,1.53ZM79.43,133.85l-2.74,2.62h-3.08v2.91h3.08l2.74,2.64v-8.16Z" - android:fillColor="#fff"/> - <path - android:pathData="M78.73,96.45l-2.73,-2.73h-4.09c-0.36,0 -0.68,-0.14 -0.95,-0.41 -0.27,-0.27 -0.41,-0.59 -0.41,-0.95v-13.64c0,-0.36 0.14,-0.68 0.41,-0.95 0.27,-0.27 0.59,-0.41 0.95,-0.41h13.64c0.36,0 0.68,0.14 0.95,0.41 0.27,0.27 0.41,0.59 0.41,0.95v13.64c0,0.36 -0.14,0.68 -0.41,0.95 -0.27,0.27 -0.59,0.41 -0.95,0.41h-4.09l-2.73,2.73ZM78.75,89.79l1.27,-2.91 2.91,-1.27 -2.91,-1.27 -1.27,-2.91 -1.3,2.91 -2.89,1.27 2.89,1.27 1.3,2.91Z" - android:fillColor="#fff"/> -</vector> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable/a11ymenu_intro.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable/a11ymenu_intro.xml index a5a05351eba6..7cc5d53d4cb6 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/drawable/a11ymenu_intro.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/drawable/a11ymenu_intro.xml @@ -1,90 +1,73 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="412dp" - android:height="299.24dp" + android:height="300dp" android:viewportWidth="412" - android:viewportHeight="299.24"> + android:viewportHeight="300"> <path - android:pathData="M383.9,299.24H28.1c-15.5,0 -28.1,-12.57 -28.1,-28.03V28.03C0,12.57 12.6,0 28.1,0H383.9c15.5,0 28.1,12.57 28.1,28.03v243.18c0,15.46 -12.6,28.03 -28.1,28.03Z" + android:pathData="M383.9,300H28.1c-15.5,0 -28.1,-12.6 -28.1,-28.1V28.1C0,12.6 12.6,0 28.1,0H383.9c15.5,0 28.1,12.6 28.1,28.1v243.8c0,15.5 -12.6,28.1 -28.1,28.1Z" android:fillColor="#fff"/> <path - android:pathData="M106.4,0h195.3c2,0 3.6,0.2 3.6,0.4V31.2c0,0.2 -1.6,0.4 -3.6,0.4H106.4c-2,0 -3.6,-0.2 -3.6,-0.4V0.4c0,-0.2 1.6,-0.4 3.6,-0.4Z" - android:fillColor="#e8eaed"/> - <path - android:pathData="M303.7,238.9H104.5v1h98.4v29.5h1v-29.5h99.8v-1Z" - android:fillColor="#e8eaed"/> - <path - android:pathData="M153.7,258.3l0.7,-0.7 -2.7,-2.7h5.9v-1h-5.9l2.7,-2.7 -0.7,-0.7 -3.9,3.9 3.9,3.9Z" - android:fillColor="#e8eaed" - android:fillType="evenOdd"/> - <path - android:pathData="M253.5,250.4l-0.7,0.7 2.7,2.7h-5.9v1h5.9l-2.7,2.7 0.7,0.7 3.9,-3.9 -3.9,-3.9Z" - android:fillColor="#7f868c" - android:fillType="evenOdd"/> - <path - android:pathData="M119.3,273h169.8c10.2,0 18.5,-8.3 18.5,-18.5V73.7c2,0 3.7,-1.7 3.7,-3.7V33.1c0,-2 -1.7,-3.7 -3.7,-3.7V0h-3.7V254.5c0,8.1 -6.6,14.8 -14.8,14.8H119.3c-8.1,0 -14.8,-6.6 -14.8,-14.8V0h-3.7V254.5c0,10.2 8.3,18.5 18.5,18.5Z" - android:fillColor="#dadce0"/> - <path - android:pathData="M141.86,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#2197f3"/> <path - android:pathData="M270.14,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#80868b"/> <path - android:pathData="M269.25,62.01h1.77v8.74h-1.77v-8.74ZM274.01,65.22l1.22,-1.22c1.66,1.44 2.76,3.54 2.76,5.97 0,4.31 -3.54,7.85 -7.85,7.85s-7.85,-3.54 -7.85,-7.85c0,-2.43 1.11,-4.53 2.76,-5.97l1.22,1.22c-1.33,1.11 -2.21,2.88 -2.21,4.76 0,3.43 2.76,6.19 6.19,6.19 3.43,0 6.19,-2.76 6.19,-6.19 -0.11,-1.99 -1.11,-3.65 -2.43,-4.76Z" + android:pathData="M291.5,52.4h2.39v11.81h-2.39v-11.81ZM297.93,56.74l1.64,-1.64c2.24,1.94 3.74,4.78 3.74,8.07 0,5.83 -4.78,10.61 -10.61,10.61s-10.61,-4.78 -10.61,-10.61c0,-3.29 1.49,-6.13 3.74,-8.07l1.64,1.64c-1.79,1.49 -2.99,3.89 -2.99,6.43 0,4.63 3.74,8.37 8.37,8.37 4.63,0 8.37,-3.74 8.37,-8.37 -0.15,-2.69 -1.49,-4.93 -3.29,-6.43Z" android:fillColor="#fff" android:fillType="evenOdd"/> <path - android:pathData="M207.03,52.23h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,39.17h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#521bbf"/> <path - android:pathData="M207.03,62.6c-0.44,0 -0.81,-0.16 -1.13,-0.47 -0.31,-0.31 -0.47,-0.69 -0.47,-1.13s0.16,-0.81 0.47,-1.13c0.31,-0.31 0.69,-0.47 1.13,-0.47s0.81,0.16 1.13,0.47c0.31,0.31 0.47,0.69 0.47,1.13s-0.16,0.81 -0.47,1.13 -0.69,0.47 -1.13,0.47ZM204.75,76.06v-10.83c-0.92,-0.07 -1.85,-0.18 -2.78,-0.32 -0.94,-0.14 -1.8,-0.31 -2.61,-0.52l0.33,-1.31c1.17,0.29 2.37,0.5 3.61,0.64 1.23,0.13 2.48,0.2 3.74,0.2s2.5,-0.07 3.74,-0.2c1.23,-0.13 2.44,-0.34 3.61,-0.64l0.33,1.31c-0.8,0.2 -1.67,0.38 -2.61,0.52 -0.94,0.14 -1.86,0.24 -2.78,0.32v10.83h-1.31v-5.35h-1.93v5.35h-1.31ZM203.45,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23ZM207.05,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23ZM210.64,80.44c-0.25,0 -0.45,-0.08 -0.6,-0.23 -0.15,-0.15 -0.23,-0.35 -0.23,-0.6 0,-0.25 0.08,-0.45 0.23,-0.6 0.15,-0.15 0.35,-0.23 0.6,-0.23s0.45,0.08 0.6,0.23c0.15,0.15 0.23,0.35 0.23,0.6 0,0.25 -0.08,0.45 -0.23,0.6 -0.15,0.15 -0.35,0.23 -0.6,0.23Z" + android:pathData="M207.39,53.2c-0.59,0 -1.1,-0.21 -1.53,-0.64 -0.42,-0.42 -0.64,-0.93 -0.64,-1.53s0.21,-1.1 0.64,-1.53c0.42,-0.42 0.93,-0.64 1.53,-0.64s1.1,0.21 1.53,0.64c0.42,0.42 0.64,0.93 0.64,1.53s-0.21,1.1 -0.64,1.53 -0.93,0.64 -1.53,0.64ZM204.31,71.39v-14.63c-1.24,-0.1 -2.5,-0.24 -3.76,-0.43 -1.26,-0.19 -2.44,-0.42 -3.53,-0.7l0.44,-1.78c1.58,0.39 3.2,0.68 4.87,0.86 1.67,0.18 3.35,0.27 5.05,0.27s3.38,-0.09 5.05,-0.27c1.67,-0.18 3.29,-0.46 4.87,-0.86l0.44,1.78c-1.09,0.28 -2.26,0.51 -3.53,0.7 -1.26,0.19 -2.52,0.33 -3.76,0.43v14.63h-1.78v-7.23h-2.61v7.23h-1.78ZM202.56,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31ZM207.42,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31ZM212.28,77.31c-0.34,0 -0.61,-0.1 -0.81,-0.31 -0.21,-0.21 -0.31,-0.48 -0.31,-0.81 0,-0.34 0.1,-0.61 0.31,-0.81 0.21,-0.21 0.48,-0.31 0.81,-0.31s0.61,0.1 0.81,0.31c0.21,0.21 0.31,0.48 0.31,0.81 0,0.34 -0.1,0.61 -0.31,0.81 -0.21,0.21 -0.48,0.31 -0.81,0.31Z" android:fillColor="#fff"/> <path - android:pathData="M141.86,180.81h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,212.98h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#de9834"/> <path - android:pathData="M141.88,209.09l-3.16,-3.06h-4.35v-4.35l-3.13,-3.13 3.13,-3.13v-4.35h4.35l3.16,-3.13 3.11,3.13h4.35v4.35l3.13,3.13 -3.13,3.13v4.35h-4.35l-3.11,3.06ZM141.88,203.08c-1.26,0 -2.34,-0.44 -3.23,-1.33 -0.89,-0.89 -1.33,-1.96 -1.33,-3.23s0.44,-2.34 1.33,-3.23c0.89,-0.89 1.96,-1.33 3.23,-1.33 1.26,0 2.34,0.44 3.23,1.33 0.89,0.89 1.33,1.96 1.33,3.23s-0.44,2.34 -1.33,3.23c-0.89,0.89 -1.96,1.33 -3.23,1.33ZM141.88,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91ZM141.88,207.12l2.53,-2.5h3.53v-3.53l2.55,-2.55 -2.55,-2.55v-3.53h-3.53l-2.53,-2.55 -2.57,2.55h-3.53v3.53l-2.55,2.55 2.55,2.55v3.53h3.51l2.6,2.5Z" + android:pathData="M119.34,251.2l-4.27,-4.14h-5.88v-5.88l-4.23,-4.23 4.23,-4.23v-5.88h5.88l4.27,-4.23 4.2,4.23h5.88v5.88l4.23,4.23 -4.23,4.23v5.88h-5.88l-4.2,4.14ZM119.34,243.08c-1.71,0 -3.16,-0.6 -4.36,-1.8 -1.2,-1.2 -1.8,-2.65 -1.8,-4.36s0.6,-3.16 1.8,-4.36c1.2,-1.2 2.65,-1.8 4.36,-1.8 1.71,0 3.16,0.6 4.36,1.8 1.2,1.2 1.8,2.65 1.8,4.36s-0.6,3.16 -1.8,4.36c-1.2,1.2 -2.65,1.8 -4.36,1.8ZM119.34,241.18c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23ZM119.34,248.55l3.41,-3.38h4.77v-4.77l3.44,-3.44 -3.44,-3.44v-4.77h-4.77l-3.41,-3.44 -3.48,3.44h-4.77v4.77l-3.44,3.44 3.44,3.44v4.77h4.74l3.51,3.38Z" android:fillColor="#fff"/> <path - android:pathData="M207.03,180.82h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,212.99h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#de9834"/> <path - android:pathData="M207.05,209.09l-3.16,-3.06h-4.35v-4.35l-3.13,-3.13 3.13,-3.13v-4.35h4.35l3.16,-3.13 3.11,3.13h4.35v4.35l3.13,3.13 -3.13,3.13v4.35h-4.35l-3.11,3.06ZM207.05,203.08c1.26,0 2.34,-0.44 3.23,-1.33 0.89,-0.89 1.33,-1.96 1.33,-3.23s-0.44,-2.34 -1.33,-3.23c-0.89,-0.89 -1.96,-1.33 -3.23,-1.33 -1.26,0 -2.34,0.44 -3.23,1.33 -0.89,0.89 -1.33,1.96 -1.33,3.23s0.44,2.34 1.33,3.23c0.89,0.89 1.96,1.33 3.23,1.33ZM207.05,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91ZM207.05,207.13l2.53,-2.5h3.53v-3.53l2.55,-2.55 -2.55,-2.55v-3.53h-3.53l-2.53,-2.55 -2.57,2.55h-3.53v3.53l-2.55,2.55 2.55,2.55v3.53h3.51l2.6,2.5ZM207.05,201.68c0.89,0 1.64,-0.3 2.24,-0.91 0.61,-0.61 0.91,-1.36 0.91,-2.24 -0,-0.89 -0.3,-1.64 -0.91,-2.24 -0.61,-0.61 -1.36,-0.91 -2.24,-0.91 -0.89,0 -1.64,0.3 -2.24,0.91 -0.61,0.61 -0.91,1.36 -0.91,2.24s0.3,1.64 0.91,2.24c0.61,0.61 1.36,0.91 2.24,0.91Z" + android:pathData="M207.42,251.21l-4.27,-4.14h-5.88v-5.88l-4.23,-4.23 4.23,-4.23v-5.88h5.88l4.27,-4.23 4.2,4.23h5.88v5.88l4.23,4.23 -4.23,4.23v5.88h-5.88l-4.2,4.14ZM207.42,243.09c1.71,0 3.16,-0.6 4.36,-1.8 1.2,-1.2 1.8,-2.65 1.8,-4.36s-0.6,-3.16 -1.8,-4.36c-1.2,-1.2 -2.65,-1.8 -4.36,-1.8 -1.71,0 -3.16,0.6 -4.36,1.8 -1.2,1.2 -1.8,2.65 -1.8,4.36s0.6,3.16 1.8,4.36c1.2,1.2 2.65,1.8 4.36,1.8ZM207.42,241.19c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23ZM207.42,248.55l3.41,-3.38h4.77v-4.77l3.44,-3.44 -3.44,-3.44v-4.77h-4.77l-3.41,-3.44 -3.48,3.44h-4.77v4.77l-3.44,3.44 3.44,3.44v4.77h4.74l3.51,3.38ZM207.42,241.19c1.2,0 2.21,-0.41 3.03,-1.23 0.82,-0.82 1.23,-1.83 1.23,-3.03 -0,-1.2 -0.41,-2.21 -1.23,-3.03 -0.82,-0.82 -1.83,-1.23 -3.03,-1.23 -1.2,0 -2.21,0.41 -3.03,1.23 -0.82,0.82 -1.23,1.83 -1.23,3.03s0.41,2.21 1.23,3.03c0.82,0.82 1.83,1.23 3.03,1.23Z" android:fillColor="#fff"/> <path - android:pathData="M270.14,180.81h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,212.98h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#438947"/> <path - android:pathData="M263.92,207.44c-0.4,0 -0.74,-0.14 -1.02,-0.42s-0.42,-0.62 -0.42,-1.02v-10.37c0,-0.4 0.14,-0.74 0.42,-1.02s0.62,-0.42 1.02,-0.42h1.67v-2.29c0,-1.26 0.44,-2.33 1.33,-3.22 0.88,-0.88 1.96,-1.33 3.22,-1.33s2.33,0.44 3.22,1.33c0.88,0.88 1.33,1.96 1.33,3.22v2.29h1.67c0.4,0 0.74,0.14 1.02,0.42s0.42,0.62 0.42,1.02v10.37c0,0.4 -0.14,0.74 -0.42,1.02s-0.62,0.42 -1.02,0.42h-12.43ZM263.92,206.01h12.43v-10.37h-12.43v10.37ZM270.14,202.66c0.51,0 0.94,-0.18 1.3,-0.53s0.54,-0.77 0.54,-1.27c0,-0.48 -0.18,-0.91 -0.54,-1.3s-0.79,-0.59 -1.3,-0.59 -0.94,0.2 -1.3,0.59c-0.36,0.39 -0.54,0.82 -0.54,1.3 0,0.49 0.18,0.92 0.54,1.27s0.79,0.53 1.3,0.53ZM267.03,194.2h6.22v-2.29c0,-0.86 -0.3,-1.59 -0.91,-2.2 -0.61,-0.61 -1.34,-0.91 -2.2,-0.91s-1.59,0.3 -2.2,0.91 -0.91,1.34 -0.91,2.2v2.29ZM263.92,206.01v0Z" + android:pathData="M284.29,248.97c-0.54,0 -1,-0.19 -1.37,-0.57s-0.57,-0.83 -0.57,-1.37v-14.02c0,-0.54 0.19,-1 0.57,-1.37s0.83,-0.57 1.37,-0.57h2.26v-3.1c0,-1.7 0.6,-3.15 1.79,-4.35 1.2,-1.2 2.64,-1.79 4.35,-1.79s3.15,0.6 4.35,1.79c1.2,1.2 1.79,2.64 1.79,4.35v3.1h2.26c0.54,0 1,0.19 1.37,0.57s0.57,0.83 0.57,1.37v14.02c0,0.54 -0.19,1 -0.57,1.37s-0.83,0.57 -1.37,0.57h-16.8ZM284.29,247.03h16.8v-14.02h-16.8v14.02ZM292.7,242.51c0.69,0 1.28,-0.24 1.76,-0.71s0.73,-1.04 0.73,-1.71c0,-0.65 -0.24,-1.23 -0.73,-1.76s-1.07,-0.79 -1.76,-0.79 -1.28,0.26 -1.76,0.79c-0.48,0.53 -0.73,1.11 -0.73,1.76 0,0.67 0.24,1.24 0.73,1.71s1.07,0.71 1.76,0.71ZM288.5,231.07h8.4v-3.1c0,-1.16 -0.41,-2.15 -1.23,-2.97 -0.82,-0.82 -1.81,-1.23 -2.97,-1.23s-2.15,0.41 -2.97,1.23 -1.23,1.81 -1.23,2.97v3.1ZM284.29,247.03v0Z" android:fillColor="#fff"/> <path - android:pathData="M207.03,116.5h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M207.39,126.06h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#327969"/> <path - android:pathData="M209.17,143.6v-1.66c1.73,-0.5 3.15,-1.46 4.25,-2.88 1.1,-1.42 1.65,-3.03 1.65,-4.84 0,-1.8 -0.54,-3.42 -1.63,-4.85s-2.51,-2.38 -4.26,-2.87v-1.66c2.22,0.5 4.02,1.62 5.41,3.36 1.39,1.74 2.09,3.75 2.09,6.02s-0.7,4.27 -2.09,6.02c-1.39,1.74 -3.2,2.86 -5.41,3.36ZM197.38,137.46v-6.43h4.29l5.36,-5.36v17.15l-5.36,-5.36h-4.29ZM208.63,138.75v-9.03c0.98,0.3 1.76,0.88 2.34,1.71 0.58,0.84 0.87,1.78 0.87,2.81 0,1.02 -0.29,1.95 -0.88,2.79s-1.37,1.41 -2.33,1.71ZM205.42,129.75l-3.03,2.89h-3.4v3.22h3.4l3.03,2.92v-9.03Z" + android:pathData="M210.29,162.68v-2.25c2.34,-0.68 4.26,-1.97 5.74,-3.89 1.49,-1.92 2.23,-4.1 2.23,-6.54 0,-2.44 -0.74,-4.62 -2.21,-6.56 -1.47,-1.93 -3.39,-3.22 -5.76,-3.88v-2.25c2.99,0.68 5.43,2.19 7.32,4.55 1.88,2.35 2.83,5.06 2.83,8.13s-0.94,5.78 -2.83,8.13c-1.88,2.35 -4.32,3.87 -7.32,4.55ZM194.35,154.39v-8.69h5.8l7.24,-7.24v23.18l-7.24,-7.24h-5.8ZM209.56,156.13v-12.21c1.33,0.41 2.38,1.18 3.17,2.32 0.78,1.13 1.18,2.4 1.18,3.8 0,1.38 -0.4,2.63 -1.2,3.77s-1.85,1.91 -3.15,2.32ZM205.21,143.96l-4.09,3.91h-4.6v4.35h4.6l4.09,3.95v-12.21Z" android:fillColor="#fff"/> <path - android:pathData="M270.14,116.54h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M292.7,126.1h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#9f3ebf"/> <path - android:pathData="M275.08,127.12h-9.89v14.23h9.89v-14.23Z" + android:pathData="M299.38,140.4h-13.36v19.23h13.36v-19.23Z" android:fillColor="#fff"/> <path - android:pathData="M263.88,129.91h-3.56v8.76h3.56v-8.76Z" + android:pathData="M284.23,144.18h-4.81v11.84h4.81v-11.84Z" android:fillColor="#fff"/> <path - android:pathData="M279.96,129.91h-3.56v8.76h3.56v-8.76Z" + android:pathData="M305.97,144.18h-4.81v11.84h4.81v-11.84Z" android:fillColor="#fff"/> <path - android:pathData="M267.04,128.82h6.21v10.83h-6.21z" + android:pathData="M288.5,142.7h8.39v14.63h-8.39z" android:fillColor="#9f3ebf"/> <path - android:pathData="M141.86,116.5h0c9.77,0 17.7,7.92 17.7,17.7h0c0,9.77 -7.92,17.7 -17.7,17.7h0c-9.77,0 -17.7,-7.92 -17.7,-17.7h0c0,-9.77 7.92,-17.7 17.7,-17.7Z" + android:pathData="M119.3,126.06h0c13.21,0 23.92,10.71 23.92,23.92h0c0,13.21 -10.71,23.92 -23.92,23.92h0c-13.21,0 -23.92,-10.71 -23.92,-23.92h0c0,-13.21 10.71,-23.92 23.92,-23.92Z" android:fillColor="#327969"/> <path - android:pathData="M134.62,137.44v-6.43h4.29l5.36,-5.36v17.16l-5.36,-5.36h-4.29ZM145.88,138.73v-9.03c0.97,0.3 1.74,0.88 2.33,1.72 0.59,0.84 0.88,1.78 0.88,2.81 0,1.05 -0.29,1.99 -0.88,2.81s-1.37,1.39 -2.33,1.69ZM142.66,129.72l-3.03,2.9h-3.4v3.22h3.4l3.03,2.92v-9.03Z" + android:pathData="M109.52,154.35v-8.7h5.8l7.25,-7.25v23.19l-7.25,-7.25h-5.8ZM124.74,156.09v-12.21c1.3,0.41 2.36,1.18 3.15,2.32 0.8,1.14 1.2,2.4 1.2,3.8 0,1.43 -0.4,2.69 -1.2,3.8s-1.85,1.87 -3.15,2.28ZM120.39,143.92l-4.09,3.91h-4.6v4.35h4.6l4.09,3.95v-12.21Z" android:fillColor="#fff"/> <path - android:pathData="M141.86,81.15l-2.93,-2.93h-4.39c-0.39,0 -0.73,-0.15 -1.02,-0.44 -0.29,-0.29 -0.44,-0.63 -0.44,-1.02v-14.63c0,-0.39 0.15,-0.73 0.44,-1.02 0.29,-0.29 0.63,-0.44 1.02,-0.44h14.63c0.39,0 0.73,0.15 1.02,0.44 0.29,0.29 0.44,0.63 0.44,1.02v14.63c0,0.39 -0.15,0.73 -0.44,1.02 -0.29,0.29 -0.63,0.44 -1.02,0.44h-4.39l-2.93,2.93ZM141.88,74l1.37,-3.12 3.12,-1.37 -3.12,-1.37 -1.37,-3.12 -1.39,3.12 -3.1,1.37 3.1,1.37 1.39,3.12Z" + android:pathData="M119.09,78.27l-3.9,-4.01 -5.93,-0.08c-0.53,-0.01 -0.99,-0.21 -1.38,-0.61 -0.39,-0.4 -0.58,-0.86 -0.57,-1.39l0.26,-19.77c0.01,-0.53 0.21,-0.99 0.61,-1.38 0.4,-0.39 0.86,-0.58 1.39,-0.57l19.77,0.26c0.53,0.01 0.99,0.21 1.38,0.61 0.39,0.4 0.58,0.86 0.57,1.39l-0.26,19.77c-0.01,0.53 -0.21,0.99 -0.61,1.38 -0.4,0.39 -0.86,0.58 -1.39,0.57l-5.93,-0.08 -4.01,3.9ZM119.25,68.61l1.9,-4.19 4.24,-1.79 -4.19,-1.9 -1.79,-4.24 -1.93,4.19 -4.21,1.79 4.16,1.9 1.82,4.24Z" android:fillColor="#fff"/> </vector> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml new file mode 100644 index 000000000000..d25970cc6abf --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Toeganklikheid- kieslys"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Die Toeganklikheidkieslys bied ’n groot kieslys op die skerm om jou toestel te beheer. Jy kan jou toestel sluit, volume en helderheid beheer, skermskote neem, en meer."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Toeganklikheidinstellings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volumekontroles"</string> + <string name="power_label" msgid="7699720321491287839">"Krag"</string> + <string name="power_utterance" msgid="7444296686402104807">"Kragopsies"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Onlangse programme"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Sluitskerm"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Kitsinstellings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Kennisgewings"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skermkiekie"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Neem skermkiekie"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume harder"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume sagter"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Verhoog helderheid"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Verlaag helderheid"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Gaan na vorige skerm toe"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Gaan na volgende skerm toe"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Die Toeganklikheidkieslys bied ’n groot kieslys op die skerm om jou toestel te beheer. Jy kan jou toestel sluit, volume en helderheid beheer, skermskote neem, en meer."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Beheer toestel deur groot kieslys"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Toeganklikheidkieslys-instellings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Groot knoppies"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Maak Toeganklikheidkieslys-knoppies groter"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hulp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Helderheid <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiekvolume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml new file mode 100644 index 000000000000..fa189899e815 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"የተደራሽነት ምናሌ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገጽ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገጽ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> + <string name="assistant_label" msgid="6796392082252272356">"ረዳት"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"የተደራሽነት ቅንብሮች"</string> + <string name="volume_label" msgid="3682221827627150574">"ድምፅ"</string> + <string name="volume_utterance" msgid="408291570329066290">"የድምጽ መቆጣጠሪያዎች"</string> + <string name="power_label" msgid="7699720321491287839">"ኃይል"</string> + <string name="power_utterance" msgid="7444296686402104807">"የኃይል አማራጮች"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"የቅርብ ጊዜ መተግበሪያዎች"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ማያ ገጽ ቁልፍ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ፈጣን ቅንብሮች"</string> + <string name="notifications_label" msgid="6829741046963013567">"ማሳወቂያዎች"</string> + <string name="screenshot_label" msgid="863978141223970162">"ቅጽበታዊ ገጽ እይታ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ቅጽበታዊ ገጽ እይታን ያነሳል"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ድምፅ ጨምር"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ድምፅ ቀንስ"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ብሩህነት ጨምር"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ብሩህነት ቀንስ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ወደ ቀዳሚው ማያ ገጽ ይሂዱ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ወደ ቀጣዩ ማያ ገጽ ይሂዱ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገጽ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገጽ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"መሣሪያውን በትልቅ ምናሌ በኩል ይቆጣጠሩ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"የተደራሽነት ምናሌ ቅንብሮች"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ትልቅ አዝራሮች"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"የተደራሽነት ምናሌ አዝራሮች መጠን ይጨምሩ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"እገዛ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"የብርሃን መጠን <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"የሙዚቃ ድምፅ መጠን<xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml new file mode 100644 index 000000000000..89e42a3bc015 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"قائمة \"تسهيل الاستخدام\""</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"قائمة \"تسهيل الاستخدام\" هي قائمة كبيرة تظهر على الشاشة وتتيح لك التحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك والتحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string> + <string name="assistant_label" msgid="6796392082252272356">"مساعِد"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"إعدادات \"سهولة الاستخدام\""</string> + <string name="volume_label" msgid="3682221827627150574">"مستوى الصوت"</string> + <string name="volume_utterance" msgid="408291570329066290">"عناصر التحكم في مستوى الصوت"</string> + <string name="power_label" msgid="7699720321491287839">"زر التشغيل"</string> + <string name="power_utterance" msgid="7444296686402104807">"خيارات التشغيل"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"التطبيقات المستخدمة مؤخرًا"</string> + <string name="lockscreen_label" msgid="648347953557887087">"شاشة القفل"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"الإعدادات السريعة"</string> + <string name="notifications_label" msgid="6829741046963013567">"الإشعارات"</string> + <string name="screenshot_label" msgid="863978141223970162">"لقطة شاشة"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"أخذ لقطة شاشة"</string> + <string name="volume_up_label" msgid="8592766918780362870">"رفع الصوت"</string> + <string name="volume_down_label" msgid="8574981863656447346">"خفض الصوت"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"رفع مستوى السطوع"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"خفض مستوى السطوع"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"الانتقال إلى الشاشة السابقة"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"الانتقال إلى الشاشة التالية"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"توفّر قائمة \"تسهيل الاستخدام\" قائمةً كبيرةً تُعرض على الشاشة تتيح لك الحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك أو التحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"التحكُّم في جهازك من خلال قائمة كبيرة الحجم"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"إعدادات قائمة \"سهولة الاستخدام\""</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"الأزرار الكبيرة"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"زيادة حجم أزرار قائمة \"سهولة الاستخدام\""</string> + <string name="pref_help_title" msgid="6871558837025010641">"مساعدة"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"السطوع <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"مستوى صوت الموسيقى <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml new file mode 100644 index 000000000000..0528f39116b8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"সাধ্য সুবিধাসমূহৰ মেনু"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"সাধ্য সুবিধাৰ মেনুখনে আপোনাৰ ডিভাইচটো নিয়ন্ত্ৰণ কৰিবলৈ স্ক্ৰীনত এখন ডাঙৰ মেনু দেখুৱায়। আপুনি নিজৰ ডিভাইচটো লক কৰিব পাৰে, ভলিউম আৰু উজ্জ্বলতা নিয়ন্ত্ৰণ কৰিব পাৰে, স্ক্ৰীনশ্বট ল’ব পাৰে আৰু বহুতো কাম কৰিব পাৰে।"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"সাধ্য সুবিধাৰ ছেটিং"</string> + <string name="volume_label" msgid="3682221827627150574">"ভলিউম"</string> + <string name="volume_utterance" msgid="408291570329066290">"ভলিউমৰ নিয়ন্ত্ৰণসমূহ"</string> + <string name="power_label" msgid="7699720321491287839">"অন/অফ"</string> + <string name="power_utterance" msgid="7444296686402104807">"অন/অফ বুটামৰ বিকল্পসমূহ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"শেহতীয়া এপসমূহ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"লক স্ক্ৰীন"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ক্ষিপ্ৰ ছেটিং"</string> + <string name="notifications_label" msgid="6829741046963013567">"জাননীসমূহ"</string> + <string name="screenshot_label" msgid="863978141223970162">"স্ক্ৰীণশ্বট"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"স্ক্ৰীণশ্বট লওক"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ভলিউম বঢ়াওক"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ভলিউম কমাওক"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"উজ্জ্বলতা বঢ়াওক"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"উজ্জ্বলতা কমাওক"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"পূৰ্বৱৰ্তী স্ক্ৰীনখনলৈ যাওক"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"পৰৱৰ্তী স্ক্ৰীনখনলৈ যাওক"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"সাধ্য সুবিধা মেনুৱে আপোনাৰ ডিভাইচটো নিয়ন্ত্ৰণ কৰিবলৈ স্ক্ৰীনত এখন বৃহৎ মেনু দেখুৱায়। আপুনি নিজৰ ডিভাইচটো লক কৰিব পাৰে, ভলিউম আৰু উজ্জ্বলতা নিয়ন্ত্ৰণ কৰিব পাৰে, স্ক্ৰীনশ্বট ল’ব পাৰে আৰু লগতে বহুতো কাম কৰিব পাৰে।"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ডাঙৰ মেনুৰ জৰিয়তে ডিভাইচ নিয়ন্ত্ৰণ কৰক"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"সাধ্য সুবিধা মেনুৰ ছেটিং"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ডাঙৰ বুটাম"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"সাধ্য সুবিধাৰ মেনু বুটামবিলাকৰ আকাৰ বঢ়াওক"</string> + <string name="pref_help_title" msgid="6871558837025010641">"সহায়"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"উজ্জ্বলতা <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"সংগীতৰ ভলিউম <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml new file mode 100644 index 000000000000..f366f3d7bbba --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Əlçatımlılıq Menyusu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Əlçatımlılıq Menyusu cihazınızı idarə etmək üçün böyük geniş ekran menyusu təqdim edir. Cihazı kilidləyə, səs səviyyəsinə və parlaqlığa nəzarət edə, skrinşotlar çəkə və s. edə bilərsiniz."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Əlçatımlılıq Ayarları"</string> + <string name="volume_label" msgid="3682221827627150574">"Səs"</string> + <string name="volume_utterance" msgid="408291570329066290">"Səs nəzarətləri"</string> + <string name="power_label" msgid="7699720321491287839">"Yandırıb-söndürmə düyməsi"</string> + <string name="power_utterance" msgid="7444296686402104807">"Qidalanma düyməsi seçimləri"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Son tətbiqlər"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ekran kilidi"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Sürətli Ayarlar"</string> + <string name="notifications_label" msgid="6829741046963013567">"Bildirişlər"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skrinşot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Skrinşot çəkin"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Səsi artırın"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Səsi azaldın"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Parlaqlığı artırın"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Parlaqlığı azaldın"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Əvvəlki ekrana keçin"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Növbəti ekrana keçin"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Əlçatımlılıq Menyusu cihazınızı idarə etmək üçün böyük geniş ekran menyusu təqdim edir. Cihazı kilidləyə, səs səviyyəsinə və parlaqlığa nəzarət edə, skrinşotlar çəkə və s. edə bilərsiniz."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Cihazı böyük menyu ilə idarə edin"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Əlçatımlılıq Menyusu Ayarları"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Böyük düymələr"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Əlçatımlıq Menyusu Düymələrinin ölçüsünü artırın"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Yardım"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Parlaqlıq <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiqinin səs həcmi <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..fa2ca2415811 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni Pristupačnost"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni Pristupačnost pruža veliki meni na ekranu za kontrolu uređaja. Možete da zaključate uređaj, kontrolišete jačinu zvuka i osvetljenost, pravite snimke ekrana i drugo."</string> + <string name="assistant_label" msgid="6796392082252272356">"Pomoćnik"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Podešavanja pristupačnosti"</string> + <string name="volume_label" msgid="3682221827627150574">"Jačina zvuka"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrole jačine zvuka"</string> + <string name="power_label" msgid="7699720321491287839">"Napajanje"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Zaključan ekran"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Brza podešavanja"</string> + <string name="notifications_label" msgid="6829741046963013567">"Obaveštenja"</string> + <string name="screenshot_label" msgid="863978141223970162">"Snimak ekrana"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Snimi ekran"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Pojačaj zvuk"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Utišaj zvuk"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Povećajte osvetljenost"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Smanjite osvetljenost"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Idi na prethodni ekran"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Idi na sledeći ekran"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni Pristupačnost pruža veliki meni na ekranu za kontrolu uređaja. Možete da zaključate uređaj, kontrolišete jačinu zvuka i osvetljenost, pravite snimke ekrana i drugo."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrolišite uređaj pomoću velikog menija"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Podešavanja menija Pristupačnost"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Velika dugmad"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećajte veličinu dugmadi u meniju za pristupačnost"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomoć"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Osvetljenost: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina zvuka muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml new file mode 100644 index 000000000000..53ce5fa45be4 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Спецыяльныя магчымасці"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Меню спецыяльных магчымасцей – гэта вялікае экраннае меню для кіравання прыладай. Вы можаце блакіраваць прыладу, рэгуляваць гучнасць і яркасць, рабіць здымкі экрана і выконваць іншыя дзеянні."</string> + <string name="assistant_label" msgid="6796392082252272356">"Памочнік"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Налады спецыяльных магчымасцей"</string> + <string name="volume_label" msgid="3682221827627150574">"Гучнасць"</string> + <string name="volume_utterance" msgid="408291570329066290">"Рэгулятары гучнасці"</string> + <string name="power_label" msgid="7699720321491287839">"Кнопка сілкавання"</string> + <string name="power_utterance" msgid="7444296686402104807">"Налады кнопкі сілкавання"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Нядаўнія праграмы"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Экран блакіроўкі"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Хуткія налады"</string> + <string name="notifications_label" msgid="6829741046963013567">"Апавяшчэнні"</string> + <string name="screenshot_label" msgid="863978141223970162">"Здымак экрана"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Зрабіць здымак экрана"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Павялічыць гучнасць"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Паменшыць гучнасць"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Павялічыць яркасць"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Паменшыць яркасць"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Вярнуцца на папярэдні экран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Перайсці на наступны экран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Меню спецыяльных магчымасцей – гэта вялікае экраннае меню для кіравання прыладай. Вы можаце блакіраваць прыладу, рэгуляваць гучнасць і яркасць, рабіць здымкі экрана і выконваць іншыя дзеянні."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Кіраваць прыладай праз вялікае меню"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Налады меню спец. магчым."</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Вялікія кнопкі"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Павялічыць памер кнопак меню спецыяльных магчымасцей"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Даведка"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Яркасць: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Гучнасць музыкі: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml new file mode 100644 index 000000000000..709a6e0d27f6 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню за достъпност"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Менюто за достъпност предоставя голямо екранно меню за управление на устройството ви. Можете да заключвате устройството си, да управлявате яркостта и силата на звука, да правите екранни снимки и др."</string> + <string name="assistant_label" msgid="6796392082252272356">"Асистент"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Асистент"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Настройки за достъпност"</string> + <string name="volume_label" msgid="3682221827627150574">"Сила на звука"</string> + <string name="volume_utterance" msgid="408291570329066290">"Контроли за силата на звука"</string> + <string name="power_label" msgid="7699720321491287839">"Захранване"</string> + <string name="power_utterance" msgid="7444296686402104807">"Опции за захранването"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Скорошни приложения"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Заключен екран"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Бързи настройки"</string> + <string name="notifications_label" msgid="6829741046963013567">"Известия"</string> + <string name="screenshot_label" msgid="863978141223970162">"Екранна снимка"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Създава екранни снимки"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Увеличаване на силата на звука"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Намаляване на силата на звука"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Увеличаване на яркостта"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Намаляване на яркостта"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Към предишния екран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Към следващия екран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Менюто за достъпност предоставя голямо екранно меню за управление на устройството ви. Можете да заключвате устройството си, да управлявате яркостта и силата на звука, да правите екранни снимки и др."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Управление на устройството чрез голямо меню"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Настр. за меню за дост."</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Големи бутони"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Увеличаване на размера на бутоните в менюто за достъпност"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Помощ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Яркост: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Сила на звука за музиката: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml new file mode 100644 index 000000000000..b5d659350108 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"অ্যাক্সেসিবিলিটি মেনু"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"আপনার ডিভাইস নিয়ন্ত্রণ করতে, \'অ্যাক্সেসিবিলিটি মেনু\' একটি বড় অন-স্ক্রিন মেনু দেখায়। আপনি ফোন লক, ভলিউম ও উজ্জ্বলতা নিয়ন্ত্রণ, স্ক্রিনশট নেওয়া এবং আরও অনেক কিছু করতে পারবেন।"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"অ্যাক্সেসিবিলিটি সেটিংস"</string> + <string name="volume_label" msgid="3682221827627150574">"ভলিউম"</string> + <string name="volume_utterance" msgid="408291570329066290">"ভলিউম নিয়ন্ত্রণ"</string> + <string name="power_label" msgid="7699720321491287839">"পাওয়ার"</string> + <string name="power_utterance" msgid="7444296686402104807">"পাওয়ারের বিকল্পগুলি"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"সাম্প্রতিক অ্যাপ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"লক স্ক্রিন"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"দ্রুত সেটিংস"</string> + <string name="notifications_label" msgid="6829741046963013567">"বিজ্ঞপ্তি"</string> + <string name="screenshot_label" msgid="863978141223970162">"স্ক্রিনশট"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"স্ক্রিনশট নিন"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ভলিউম বাড়ান"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ভলিউম কমান"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"উজ্জ্বলতা বাড়ান"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"উজ্জ্বলতা কমান"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"আগের স্ক্রিনে যান"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"পরের স্ক্রিনে যান"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"আপনার ডিভাইস নিয়ন্ত্রণ করতে, \'অ্যাক্সেসিবিলিটি মেনু\' একটি বড় অন-স্ক্রিন মেনু দেখায়। আপনি ফোন লক, ভলিউম ও উজ্জ্বলতা নিয়ন্ত্রণ, স্ক্রিনশট নেওয়া এবং আরও অনেক কিছু করতে পারবেন।"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"বড় করে দেখানো মেনুর মাধ্যমে ডিভাইস নিয়ন্ত্রণ করুন"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"অ্যাক্সেসিবিলিটি মেনুর সেটিংস"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"বোতাম বড় করা"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"অ্যাক্সেসিবিলিটি মেনু বোতামের সাইজ বাড়ান"</string> + <string name="pref_help_title" msgid="6871558837025010641">"সহায়তা"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"উজ্জ্বলতা <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"মিউজিকের ভলিউম <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml new file mode 100644 index 000000000000..227186b9ee2c --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni za pristupačnost"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni za pristupačnost pruža veliki meni na ekranu za upravljanje uređajem. Možete zaključati uređaj, kontrolirati jačinu zvuka i osvjetljenje, praviti snimke ekrana i drugo."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Postavke pristupačnosti"</string> + <string name="volume_label" msgid="3682221827627150574">"Jačina zvuka"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrole jačine zvuka"</string> + <string name="power_label" msgid="7699720321491287839">"Napajanje"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Zaključavanje ekrana"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Brze postavke"</string> + <string name="notifications_label" msgid="6829741046963013567">"Obavještenja"</string> + <string name="screenshot_label" msgid="863978141223970162">"Snimak ekrana"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Napravi snimak ekrana"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Pojačaj zvuk"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Utišaj zvuk"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Jače osvjetljenje"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Slabije osvjetljenje"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Idi na prethodni ekran"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Idi na sljedeći ekran"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni za pristupačnost pruža veliki meni na ekranu za upravljanje uređajem. Možete zaključati uređaj, kontrolirati jačinu zvuka i osvjetljenje, praviti snimke ekrana i drugo."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljajte uređajem putem velikog menija"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Postavke Menija za pristupačnost"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Velika dugmad"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećajte dugmad menija za pristupačnost"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomoć"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Osvjetljenje: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina zvuka muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml new file mode 100644 index 000000000000..08a301ce5e13 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú d\'accessibilitat"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla perquè controlis el dispositiu. Pots bloquejar-lo, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Configuració d\'accessibilitat"</string> + <string name="volume_label" msgid="3682221827627150574">"Volum"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controls de volum"</string> + <string name="power_label" msgid="7699720321491287839">"Botó d\'engegada"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcions d\'engegada"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplicacions recents"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueig"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Configuració ràpida"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificacions"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Fes una captura de pantalla"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Apuja el volum"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Abaixa el volum"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Augmenta la brillantor"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Disminueix la brillantor"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ves a la pantalla anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ves a la pantalla següent"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla perquè controlis el dispositiu. Pots bloquejar-lo, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla el dispositiu amb un menú gran"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Config. del menú d\'accessibilitat"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botons grans"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenta la mida dels botons del menú d\'accessibilitat"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ajuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillantor: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volum de la música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml new file mode 100644 index 000000000000..796a3d5bf003 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Nabídka usnadnění přístupu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Nabídka usnadnění přístupu zobrazuje na obrazovce velkou nabídku k ovládání zařízení. Můžete zamknout zařízení, upravit hlasitost a jas, pořídit snímek obrazovky apod."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavení usnadnění přístupu"</string> + <string name="volume_label" msgid="3682221827627150574">"Hlasitost"</string> + <string name="volume_utterance" msgid="408291570329066290">"Ovládání hlasitosti"</string> + <string name="power_label" msgid="7699720321491287839">"Vypínač"</string> + <string name="power_utterance" msgid="7444296686402104807">"Možnosti napájení"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Poslední aplikace"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Obrazovka uzamčení"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Rychlé nastavení"</string> + <string name="notifications_label" msgid="6829741046963013567">"Oznámení"</string> + <string name="screenshot_label" msgid="863978141223970162">"Snímek obrazovky"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Pořídit snímek obrazovky"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Zvýšit hlasitost"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Snížit hlasitost"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Zvýšit jas"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Snížit jas"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Zpět na předchozí obrazovku"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Přejít na další obrazovku"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Nabídka usnadnění přístupu zobrazuje na obrazovce velkou nabídku k ovládání zařízení. Můžete zamknout zařízení, upravit hlasitost a jas, pořídit snímek obrazovky apod."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládejte zařízení pomocí velké nabídky"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavení nabídky usnadnění přístupu"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Velká tlačítka"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zvětšit tlačítka v nabídce přístupnosti"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Nápověda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Jas <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Hlasitost hudby <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml new file mode 100644 index 000000000000..6cde7a1fd6b4 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menuen Hjælpefunktioner"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menuen Hjælpefunktioner giver dig en stor menu på skærmen, som du kan bruge til at styre din enhed. Du kan låse din enhed, justere lyd- og lysstyrken, tage screenshots og meget mere."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Indstillinger for hjælpefunktioner"</string> + <string name="volume_label" msgid="3682221827627150574">"Lydstyrke"</string> + <string name="volume_utterance" msgid="408291570329066290">"Lydstyrkeknapper"</string> + <string name="power_label" msgid="7699720321491287839">"Afbryderknap"</string> + <string name="power_utterance" msgid="7444296686402104807">"Indstillinger for afbryderknappen"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Seneste apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lås skærm"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Kvikmenu"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifikationer"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Tag et screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Lydstyrke op"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Lydstyrke ned"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Lysstyrke op"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Lysstyrke ned"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Gå til forrige skærm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Gå til næste skærm"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menuen Hjælpefunktioner giver dig en stor menu på skærmen, som bruges til at styre din enhed. Du kan låse din enhed, justere lyd- og lysstyrken, tage screenshots og meget mere."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Styr enheden via den store menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Indstillinger for menuen Hjælpefunktioner"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Store knapper"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Forstør knapperne i menuen Hjælpefunktioner"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hjælp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Lysstyrke <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Lydstyrke for musik <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml new file mode 100644 index 000000000000..7b94d9826702 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menü für Bedienungshilfen"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Einstellungen für Bedienungshilfen"</string> + <string name="volume_label" msgid="3682221827627150574">"Lautstärke"</string> + <string name="volume_utterance" msgid="408291570329066290">"Lautstärketasten"</string> + <string name="power_label" msgid="7699720321491287839">"Ein/Aus"</string> + <string name="power_utterance" msgid="7444296686402104807">"Optionen für Ein-/Aus-Taste"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Kürzlich geöffnete Apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Sperrbildschirm"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Schnelleinstellungen"</string> + <string name="notifications_label" msgid="6829741046963013567">"Benachrichtigungen"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Screenshot erstellen"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Lautstärke erhöhen"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Lautstärke verringern"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Helligkeit erhöhen"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Helligkeit verringern"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Zum vorherigen Bildschirm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Zum nächsten Bildschirm"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Gerät mit großem Menü steuern"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Menüeinstellungen für Bedienungshilfen"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Große Schaltflächen"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Schaltflächen für das Menü \"Bedienungshilfen\" vergrößern"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hilfe"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Helligkeit: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiklautstärke: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml new file mode 100644 index 000000000000..e5f7cd471ecf --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Μενού προσβασιμότητας"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Το μενού προσβασιμότητας παρέχει ένα μεγάλο μενού στην οθόνη για να ελέγχετε τη συσκευή σας. Μπορείτε να κλειδώνετε τη συσκευή, να ελέγχετε την ένταση ήχου και τη φωτεινότητα, να λαμβάνετε στιγμιότυπα οθόνης και άλλα."</string> + <string name="assistant_label" msgid="6796392082252272356">"Βοηθός"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Ρυθμίσεις προσβασιμότητας"</string> + <string name="volume_label" msgid="3682221827627150574">"Ένταση"</string> + <string name="volume_utterance" msgid="408291570329066290">"Πλήκτρα έντασης ήχου"</string> + <string name="power_label" msgid="7699720321491287839">"Κουμπί λειτουργίας"</string> + <string name="power_utterance" msgid="7444296686402104807">"Επιλογές λειτουργίας"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Πρόσφατες εφαρμογές"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Κλείδωμα οθόνης"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Γρήγορες ρυθμίσεις"</string> + <string name="notifications_label" msgid="6829741046963013567">"Ειδοποιήσεις"</string> + <string name="screenshot_label" msgid="863978141223970162">"Στιγμιότυπο οθόνης"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Λήψη στιγμιότυπου οθόνης"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Αύξηση έντασης ήχου"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Μείωση έντασης ήχου"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Αύξηση φωτεινότητας"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Μείωση φωτεινότητας"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Μετάβαση στην προηγούμενη οθόνη"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Μετάβαση στην επόμενη οθόνη"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Το μενού προσβασιμότητας παρέχει ένα μεγάλο μενού στην οθόνη για να ελέγχετε τη συσκευή σας. Μπορείτε να κλειδώνετε τη συσκευή, να ελέγχετε την ένταση ήχου και τη φωτεινότητα, να λαμβάνετε στιγμιότυπα οθόνης και άλλα."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Έλεγχος συσκευής μέσω μεγάλου μενού"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Ρυθμίσεις μενού προσβασιμότητας"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Μεγάλα κουμπιά"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Αύξηση του μεγέθους των κουμπιών στο μενού προσβασιμότητας"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Βοήθεια"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Φωτεινότητα <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Ένταση μουσικής <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml new file mode 100644 index 000000000000..04b18dd82200 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Accessibility menu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Power options"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Quick Settings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Take screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume up"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume down"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Brightness up"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Brightness down"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Go to previous screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Help"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..2b300620345e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Accessibility Menu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility Menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots, and more."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Power options"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Quick Settings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Take screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume up"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume down"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Brightness up"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Brightness down"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Go to previous screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility Menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots, and more."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Help"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml new file mode 100644 index 000000000000..04b18dd82200 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Accessibility menu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Power options"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Quick Settings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Take screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume up"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume down"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Brightness up"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Brightness down"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Go to previous screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Help"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml new file mode 100644 index 000000000000..04b18dd82200 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Accessibility menu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Power options"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Quick Settings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Take screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume up"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume down"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Brightness up"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Brightness down"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Go to previous screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Help"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml new file mode 100644 index 000000000000..8ab2c526b7d8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Accessibility Menu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility Menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots, and more."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Power options"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Quick Settings"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Take screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume up"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume down"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Brightness up"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Brightness down"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Go to previous screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility Menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots, and more."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Help"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml new file mode 100644 index 000000000000..f7628eb5b3a8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de Accesibilidad"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú de Accesibilidad es un menú de gran tamaño que se muestra en la pantalla y te permite controlar tu dispositivo. Puedes bloquearlo, controlar el volumen y el brillo, realizar capturas de pantalla y mucho más."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Configuración de accesibilidad"</string> + <string name="volume_label" msgid="3682221827627150574">"Volumen"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controles de volumen"</string> + <string name="power_label" msgid="7699720321491287839">"Encendido"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opciones de encendido"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Apps recientes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueo"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Configuración rápida"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificaciones"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Tomar captura de pantalla"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Subir volumen"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Bajar volumen"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar brillo"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Disminuir brillo"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir a la pantalla anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir a la siguiente pantalla"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú de Accesibilidad es un menú de gran tamaño que se muestra en la pantalla y te permite controlar tu dispositivo. Puedes bloquearlo, controlar el volumen y el brillo, realizar capturas de pantalla y mucho más."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlar el dispositivo mediante el menú ampliado"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Configuración del menú de accesibilidad"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botones grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta el tamaño de los botones del menú de accesibilidad"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ayuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillo: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumen de la música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml new file mode 100644 index 000000000000..50c93f7d2a5e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de accesibilidad"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú de accesibilidad es un menú de gran tamaño que se muestra en pantalla para controlar tu dispositivo. Puedes bloquear el dispositivo, controlar el volumen y el brillo, hacer capturas de pantalla y más."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Ajustes de accesibilidad"</string> + <string name="volume_label" msgid="3682221827627150574">"Volumen"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controles de volumen"</string> + <string name="power_label" msgid="7699720321491287839">"Encender"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opciones de encendido"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplicaciones recientes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueo"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Ajustes rápidos"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificaciones"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Hacer captura"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Subir volumen"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Bajar volumen"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar el brillo"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Reducir el brillo"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir a la pantalla anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir a la siguiente pantalla"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú de accesibilidad es un menú de gran tamaño que se muestra en pantalla para controlar tu dispositivo. Puedes bloquear el dispositivo, controlar el volumen y el brillo, hacer capturas de pantalla y más."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla el dispositivo con un menú de gran tamaño"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Ajustes del menú de accesibilidad"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botones grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar el tamaño de los botones del menú de accesibilidad"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ayuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillo: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumen de la música: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml new file mode 100644 index 000000000000..790d06031f90 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Juurdepääsetavuse menüü"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja heledust, jäädvustada ekraanipilte ning teha muudki."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Juurdepääsetavuse seaded"</string> + <string name="volume_label" msgid="3682221827627150574">"Helitugevus"</string> + <string name="volume_utterance" msgid="408291570329066290">"Helitugevuse juhtnupud"</string> + <string name="power_label" msgid="7699720321491287839">"Toitenupp"</string> + <string name="power_utterance" msgid="7444296686402104807">"Toitevalikud"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Hiljutised rakendused"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lukustuskuva"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Kiirseaded"</string> + <string name="notifications_label" msgid="6829741046963013567">"Märguanded"</string> + <string name="screenshot_label" msgid="863978141223970162">"Ekraanipilt"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Jäädvusta ekraanipilt"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Suurenda helitugevust"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Vähenda helitugevust"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Suurenda eredust"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Vähenda eredust"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Eelmise ekraanikuva avamine"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Järgmise ekraanikuva avamine"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja heledust, jäädvustada ekraanipilte ning teha muudki."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Seadme juhtimine suure menüü kaudu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Juurdepääsetavuse menüü seaded"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Suured nupud"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Juurdepääsetavusmenüü nuppude suuruse suurendamine"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Abi"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Eredus on <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Muusika helitugevus on <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml new file mode 100644 index 000000000000..98c0146656bb --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Erabilerraztasun-menua"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Erabilerraztasun-menuari esker, tamaina handiko menu bat izango duzu pantailan; menu horren bidez, gailua kontrolatzeko aukera izango duzu. Besteak beste, hauek egin ahalko dituzu: gailua blokeatu; bolumena eta distira kontrolatu, eta pantaila-argazkiak egin."</string> + <string name="assistant_label" msgid="6796392082252272356">"Laguntzailea"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Erabilerraztasun-ezarpenak"</string> + <string name="volume_label" msgid="3682221827627150574">"Bolumena"</string> + <string name="volume_utterance" msgid="408291570329066290">"Bolumena kontrolatzeko aukerak"</string> + <string name="power_label" msgid="7699720321491287839">"Bateria"</string> + <string name="power_utterance" msgid="7444296686402104807">"Bateria kontrolatzeko aukerak"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Azken aplikazioak"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Pantaila blokeatua"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Ezarpen bizkorrak"</string> + <string name="notifications_label" msgid="6829741046963013567">"Jakinarazpenak"</string> + <string name="screenshot_label" msgid="863978141223970162">"Pantaila-argazkia"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Atera pantaila-argazki bat"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Igo bolumena"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Jaitsi bolumena"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Handitu distira"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Txikitu distira"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Joan aurreko pantailara"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Joan hurrengo pantailara"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Erabilerraztasun-menuari esker, tamaina handiko menu bat izango duzu pantailan; menu horren bidez, gailua kontrolatzeko aukera izango duzu. Besteak beste, hauek egin ahalko dituzu: gailua blokeatu; bolumena eta distira kontrolatu, eta pantaila-argazkiak egin."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrolatu gailua menu handiaren bidez"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Erabilerraztasun-menuaren ezarpenak"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botoi handiak"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Handitu erabilerraztasun-menuko botoien tamaina"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Laguntza"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Distira: %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musikaren bolumena: %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml new file mode 100644 index 000000000000..c922b2478b6f --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"منوی دسترسپذیری"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"«منوی دسترسپذیری» منوی بزرگی را روی صفحه برای کنترل دستگاه ارائه میدهد. میتوانید دستگاه را قفل کنید، میزان صدا و روشنایی را کنترل کنید، نماگرفت ثبت کنید، و کارهای بیشتری انجام دهید."</string> + <string name="assistant_label" msgid="6796392082252272356">"دستیار"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"تنظیمات دسترسپذیری"</string> + <string name="volume_label" msgid="3682221827627150574">"میزان صدا"</string> + <string name="volume_utterance" msgid="408291570329066290">"کنترلهای میزان صدا"</string> + <string name="power_label" msgid="7699720321491287839">"نیرو"</string> + <string name="power_utterance" msgid="7444296686402104807">"گزینههای نیرو"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"برنامههای اخیر"</string> + <string name="lockscreen_label" msgid="648347953557887087">"صفحه قفل"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"تنظیمات سریع"</string> + <string name="notifications_label" msgid="6829741046963013567">"اعلانها"</string> + <string name="screenshot_label" msgid="863978141223970162">"نماگرفت"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"گرفتن نماگرفت"</string> + <string name="volume_up_label" msgid="8592766918780362870">"افزایش صدا"</string> + <string name="volume_down_label" msgid="8574981863656447346">"کاهش صدا"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"افزایش روشنایی"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"کاهش روشنایی"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"رفتن به صفحه قبل"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"رفتن به صفحه بعد"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"«منوی دسترسپذیری» منوی بزرگی را روی صفحه برای کنترل دستگاه ارائه میدهد. میتوانید دستگاه را قفل کنید، میزان صدا و روشنایی را کنترل کنید، نماگرفت ثبت کنید، و کارهای بیشتری انجام دهید."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"کنترل دستگاه ازطریق منوی بزرگ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"تنظیمات منوی دسترسپذیری"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"دکمههای بزرگ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"افزایش اندازه «دکمههای منوی دسترسپذیری»"</string> + <string name="pref_help_title" msgid="6871558837025010641">"راهنما"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"روشنایی <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"بلندی صدای موسیقی <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml new file mode 100644 index 000000000000..b9926a523e0f --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Saavutettavuusvalikko"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Saavutettavuusvalikko on suuri näyttövalikko, josta voit ohjata laitettasi. Voit esimerkiksi lukita laitteen, säätää äänenvoimakkuutta ja kirkkautta sekä ottaa kuvakaappauksia."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Esteettömyysasetukset"</string> + <string name="volume_label" msgid="3682221827627150574">"Äänenvoimakkuus"</string> + <string name="volume_utterance" msgid="408291570329066290">"Äänenvoimakkuuden hallinta"</string> + <string name="power_label" msgid="7699720321491287839">"Virta"</string> + <string name="power_utterance" msgid="7444296686402104807">"Virta-asetukset"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Viimeaikaiset sovellukset"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lukitusnäyttö"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Pika-asetukset"</string> + <string name="notifications_label" msgid="6829741046963013567">"Ilmoitukset"</string> + <string name="screenshot_label" msgid="863978141223970162">"Kuvakaappaus"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ota kuvakaappaus"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Lisää äänenvoimakkuutta"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Vähennä äänenvoimakkuutta"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Lisää kirkkautta"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Vähennä kirkkautta"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Siirry edelliselle näytöllä"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Siirry seuraavalle näytölle"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Saavutettavuusvalikko on suuri näyttövalikko, josta voit ohjata laitettasi. Voit esimerkiksi lukita laitteen, säätää äänenvoimakkuutta ja kirkkautta sekä ottaa kuvakaappauksia."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Ohjaa laitetta suurella valikolla"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Esteettömyysvalikon asetukset"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Suuret painikkeet"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Suurenna esteettömyysvalikon painikkeita"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ohje"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Kirkkaus <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiikin äänenvoimakkuus <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000000..9ac0f0412280 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu d\'accessibilité"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu Accessibilité propose un grand espace à l\'écran à l\'aide duquel vous pouvez contrôler votre appareil. Utilisez-le pour verrouiller votre appareil, régler le volume et la luminosité, prendre des captures d\'écran et plus."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Paramètres d\'accessibilité"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Commandes de volume"</string> + <string name="power_label" msgid="7699720321491287839">"Alimentation"</string> + <string name="power_utterance" msgid="7444296686402104807">"Options d\'alimentation"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Applis récentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Écran verrouillage"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Paramètres rapides"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Capture d\'écran"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Prendre une capture d\'écran"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Augmenter volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Baisser volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Augmenter luminosité"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Baisser luminosité"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Aller à l\'écran précédent"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Aller à l\'écran suivant"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Le menu Accessibilité propose un grand espace à l\'écran à l\'aide duquel vous pouvez contrôler votre appareil. Utilisez-le pour verrouiller votre appareil, régler le volume et la luminosité, prendre des captures d\'écran et plus."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Contrôlez l\'appareil à l\'aide d\'un menu de grande taille"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Paramètres du menu d\'accessibilité"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Boutons de grande taille"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenter la taille des boutons du menu d\'accessibilité"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Aide"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosité : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume de la musique : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml new file mode 100644 index 000000000000..774210d6f7db --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu d\'accessibilité"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu d\'accessibilité s\'affiche en grand sur votre écran pour vous permettre de contrôler votre appareil. Vous pouvez verrouiller votre appareil, ajuster le volume et la luminosité, réaliser des captures d\'écran, et plus encore."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibilité"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Commandes de volume"</string> + <string name="power_label" msgid="7699720321491287839">"Marche/Arrêt"</string> + <string name="power_utterance" msgid="7444296686402104807">"Options du bouton Marche/Arrêt"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Applis récentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Écran de verrouillage"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Réglages rapides"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string> + <string name="screenshot_label" msgid="863978141223970162">"Capture d\'écran"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Prendre une capture d\'écran"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Augmenter volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Baisser volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Augmenter luminosité"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Baisser luminosité"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Revenir à l\'écran précédent"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Accéder à l\'écran suivant"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Le menu d\'accessibilité s\'affiche en grand sur votre écran pour vous permettre de contrôler votre appareil. Vous pouvez verrouiller votre appareil, ajuster le volume et la luminosité, réaliser des captures d\'écran, et plus encore."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Contrôlez votre appareil via un grand menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Paramètres du menu d\'accessibilité"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Boutons de grande taille"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenter la taille des boutons du menu d\'accessibilité"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Aide"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosité : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume de la musique : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml new file mode 100644 index 000000000000..4d6656b8c135 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de accesibilidade"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"O menú de accesibilidade é un panel grande que aparece na pantalla co que podes controlar o dispositivo. Permíteche realizar varias accións, entre elas, bloquear o dispositivo, controlar o volume, axustar o brillo e facer capturas de pantalla."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Accesibilidade (configuración)"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controis de volume"</string> + <string name="power_label" msgid="7699720321491287839">"Acender"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcións de acendido"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplicacións recentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueo"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Configuración rápida"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificacións"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Fai unha captura de pantalla"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Subir volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Baixar volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar brillo"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Reducir brillo"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir á pantalla anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir á seguinte pantalla"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"O menú de accesibilidade é un panel grande que aparece na pantalla e permite controlar o dispositivo. Permíteche realizar varias accións, como bloquear o dispositivo, controlar o volume, axustar o brillo e facer capturas de pantalla."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla o dispositivo a través dun menú grande"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Configuración do menú de accesibilidade"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botóns grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta o tamaño dos botóns do menú de accesibilidade"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Axuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillo: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume da música: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml new file mode 100644 index 000000000000..adada824ecb7 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ઍક્સેસિબિલિટી મેનૂ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ઍક્સેસિબિલિટી મેનૂ તમારા ડિવાઇસને નિયંત્રિત કરવા માટે મોટું ઑન-સ્ક્રીન મેનૂ પૂરું પાડે છે. તમે તમારા ડિવાઇસને લૉક કરી શકો છો, વૉલ્યૂમ અને બ્રાઇટનેસ નિયંત્રિત કરી શકો છો, સ્ક્રીનશૉટ લઈ શકો છો અને બીજું ઘણું બધું કરી શકો છો."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ઍક્સેસિબિલિટી સેટિંગ"</string> + <string name="volume_label" msgid="3682221827627150574">"વૉલ્યૂમ"</string> + <string name="volume_utterance" msgid="408291570329066290">"વૉલ્યૂમ નિયંત્રણો"</string> + <string name="power_label" msgid="7699720321491287839">"પાવર"</string> + <string name="power_utterance" msgid="7444296686402104807">"પાવર વિકલ્પો"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"તાજેતરની ઍપ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"લૉક સ્ક્રીન"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ઝડપી સેટિંગ"</string> + <string name="notifications_label" msgid="6829741046963013567">"નોટિફિકેશન"</string> + <string name="screenshot_label" msgid="863978141223970162">"સ્ક્રીનશૉટ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"સ્ક્રીનશૉટ લો"</string> + <string name="volume_up_label" msgid="8592766918780362870">"વૉલ્યૂમ વધારો"</string> + <string name="volume_down_label" msgid="8574981863656447346">"વૉલ્યૂમ ઘટાડો"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"બ્રાઇટનેસ વધારો"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"બ્રાઇટનેસ ઘટાડો"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"પાછલી સ્ક્રીન પર જાઓ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"આગલી સ્ક્રીન પર જાઓ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ઍક્સેસિબિલિટી મેનૂ તમારા ડિવાઇસને નિયંત્રિત કરવા માટે મોટું ઑન-સ્ક્રીન મેનૂ પૂરું પાડે છે. તમે તમારા ડિવાઇસને લૉક કરી શકો છો, વૉલ્યૂમ અને બ્રાઇટનેસ નિયંત્રિત કરી શકો છો, સ્ક્રીનશૉટ લઈ શકો છો અને બીજું ઘણું બધું કરી શકો છો."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"મોટા મેનૂ મારફતે ડિવાઇસને નિયંત્રિત કરો"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ઍક્સેસિબિલિટી મેનૂ સેટિંગ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"મોટા બટન"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ઍક્સેસિબિલિટી મેનૂ બટનનું કદ વધારો"</string> + <string name="pref_help_title" msgid="6871558837025010641">"સહાય"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"બ્રાઇટનેસ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"મ્યુઝિકનું વૉલ્યૂમ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml new file mode 100644 index 000000000000..ee558952dd54 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"सुलभता मेन्यू"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"सुलभता मेन्यू, स्क्रीन पर दिखने वाला एक बड़ा मेन्यू होता है. इसकी मदद से, अपने डिवाइस को कंट्रोल किया जा सकता है. इस मेन्यू में जाकर, अपना डिवाइस लॉक करने, स्क्रीनशॉट लेने, स्क्रीन की रोशनी और आवाज़ कंट्रोल करने जैसे कई दूसरे काम किए जा सकते हैं."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"सुलभता सेटिंग"</string> + <string name="volume_label" msgid="3682221827627150574">"आवाज़"</string> + <string name="volume_utterance" msgid="408291570329066290">"आवाज़ कम या ज़्यादा करने का बटन"</string> + <string name="power_label" msgid="7699720321491287839">"पावर बटन"</string> + <string name="power_utterance" msgid="7444296686402104807">"पावर बटन के विकल्प"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"हाल में इस्तेमाल किए गए ऐप्लिकेशन"</string> + <string name="lockscreen_label" msgid="648347953557887087">"लॉक स्क्रीन"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"क्विक सेटिंग"</string> + <string name="notifications_label" msgid="6829741046963013567">"सूचनाएं"</string> + <string name="screenshot_label" msgid="863978141223970162">"स्क्रीनशॉट"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"स्क्रीनशॉट लें"</string> + <string name="volume_up_label" msgid="8592766918780362870">"आवाज़ बढ़ाएं"</string> + <string name="volume_down_label" msgid="8574981863656447346">"आवाज़ कम करें"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"स्क्रीन की रोशनी बढ़ाएं"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"स्क्रीन की रोशनी कम करें"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"पिछली स्क्रीन पर जाएं"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"अगली स्क्रीन पर जाएं"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"सुलभता मेन्यू, स्क्रीन पर दिखने वाला एक बड़ा मेन्यू होता है. इसकी मदद से, अपने डिवाइस को कंट्रोल किया जा सकता है. इस मेन्यू में जाकर, अपना डिवाइस लॉक करने, स्क्रीनशॉट लेने, स्क्रीन की रोशनी और आवाज़ कंट्रोल करने जैसे कई दूसरे काम किए जा सकते हैं."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"बड़े मेन्यू की मदद से डिवाइस को कंट्रोल करें"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"सुलभता मेन्यू सेटिंग"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"बड़े बटन"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"सुलभता मेन्यू के बटनाें का आकार बढ़ाएं"</string> + <string name="pref_help_title" msgid="6871558837025010641">"सहायता"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"स्क्रीन की रोशनी <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"संगीत की आवाज़ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml new file mode 100644 index 000000000000..0be6f7536a61 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Izbornik pristupačnosti"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Izbornik pristupačnosti pruža velik izbornik na zaslonu u svrhu upravljanja uređajem. Možete zaključati uređaj, upravljati glasnoćom i svjetlinom, izrađivati snimke zaslona i drugo."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Postavke pristupačnosti"</string> + <string name="volume_label" msgid="3682221827627150574">"Glasnoća"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrole za glasnoću"</string> + <string name="power_label" msgid="7699720321491287839">"Napajanje"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Zaključan zaslon"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Brze postavke"</string> + <string name="notifications_label" msgid="6829741046963013567">"Obavijesti"</string> + <string name="screenshot_label" msgid="863978141223970162">"Snimka zaslona"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Snimi zaslon"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Pojačaj"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Stišaj"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Pojačaj svjetlinu"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Smanji svjetlinu"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Idi na prethodni zaslon"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Idi na sljedeći zaslon"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Izbornik pristupačnosti pruža velik izbornik na zaslonu u svrhu upravljanja uređajem. Možete zaključati uređaj, upravljati glasnoćom i svjetlinom, izrađivati snimke zaslona i drugo."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljanje uređajem pomoću velikog izbornika"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Postavke izbornika pristupačnosti"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veliki gumbi"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećanje veličine gumba izbornika Pristupačnosti"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomoć"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Svjetlina <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Glasnoća glazbe <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml new file mode 100644 index 000000000000..9dce8aefe6f4 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Kisegítő lehetőségek menüje"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"A Kisegítő lehetőségek menüje az eszköz vezérlésére szolgáló nagyméretű, képernyőn megjelenő menü. Lezárhatja vele az eszközt, szabályozhatja a hang- és a fényerőt, képernyőképeket készíthet, és egyebekre is használhatja."</string> + <string name="assistant_label" msgid="6796392082252272356">"Segéd"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Kisegítő lehetőségek beállításai"</string> + <string name="volume_label" msgid="3682221827627150574">"Hangerő"</string> + <string name="volume_utterance" msgid="408291570329066290">"Hangerő-szabályozó"</string> + <string name="power_label" msgid="7699720321491287839">"Bekapcsológomb"</string> + <string name="power_utterance" msgid="7444296686402104807">"Bekapcsológomb beállításai"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Legutóbbi alkalmazások"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lezárási képernyő"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Gyorsbeállítások"</string> + <string name="notifications_label" msgid="6829741046963013567">"Értesítések"</string> + <string name="screenshot_label" msgid="863978141223970162">"Képernyőkép"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Képernyőkép készítése"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Hangerő növelése"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Hangerő csökkentése"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Fényerő növelése"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Fényerő csökkentése"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ugrás az előző képernyőre"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ugrás a következő képernyőre"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"A Kisegítő lehetőségek menüje az eszköz vezérlésére szolgáló nagyméretű, képernyőn megjelenő menü. Lezárhatja az eszközt, szabályozhatja a hang- és a fényerőt, képernyőképeket készíthet, és egyebekre is használhatja a funkciót."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Nagyméretű menün keresztül vezérelheti eszközét"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"A kisegítő lehetőségek menü beállításai"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Nagy gombok"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"A Kisegítő lehetőségek menüben található gombok méretének növelése"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Súgó"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Fényerő: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Zene hangereje: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml new file mode 100644 index 000000000000..52d5d0e38799 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Հատուկ գործառույթների ընտրացանկ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Հատուկ գործառույթների մեծ ընտրացանկը նախատեսված է ձեր սարքը կառավարելու համար։ Դուք կարող եք կողպել ձեր հեռախոսը, կարգավորել պայծառությունը և ձայնի ուժգնությունը, սքրինշոթներ անել և այլն։"</string> + <string name="assistant_label" msgid="6796392082252272356">"Օգնական"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Հատուկ գործառույթների կարգավորումներ"</string> + <string name="volume_label" msgid="3682221827627150574">"Ձայն"</string> + <string name="volume_utterance" msgid="408291570329066290">"Ձայնի ուժգնության կառավարներ"</string> + <string name="power_label" msgid="7699720321491287839">"Սնուցման կոճակ"</string> + <string name="power_utterance" msgid="7444296686402104807">"Սնուցման կոճակի ընտրանքներ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Վերջին օգտագործած հավելվածները"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Կողպէկրան"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Արագ կարգավորումներ"</string> + <string name="notifications_label" msgid="6829741046963013567">"Ծանուցումներ"</string> + <string name="screenshot_label" msgid="863978141223970162">"Սքրինշոթ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ստանալ սքրինշոթը"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Բարձրացնել ձայնը"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Իջեցնել ձայնը"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Ավելացնել պայծառությունը"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Պակասեցնել պայծառությունը"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Անցնել նախորդ էկրան"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Անցնել հաջորդ էկրան"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Հատուկ գործառույթների մեծ ընտրացանկը նախատեսված է ձեր սարքը կառավարելու համար: Դուք կարող եք կողպել ձեր հեռախոսը, կարգավորել պայծառությունը և ձայնի ուժգնությունը, սքրինշոթներ անել և այլն։"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Կառավարել սարքը մեծ ընտրացանկի միջոցով"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Հատուկ գործառույթների ընտրացանկի կարգավորումներ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Մեծ կոճակներ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Մեծացնել «Հատուկ գործառույթների» ընտրացանկի կոճակները"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Օգնություն"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Պայծառությունը՝ <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Երաժշտության ձայնի ուժգնությունը՝ <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml new file mode 100644 index 000000000000..d58cf89e4a66 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Aksesibilitas"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Aksesibilitas menyediakan menu di layar dengan ukuran besar untuk mengontrol perangkat Anda. Anda dapat mengunci perangkat, mengontrol volume dan kecerahan, mengambil screenshot, dan banyak lagi."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asisten"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Setelan Aksesibilitas"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrol volume"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opsi power"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplikasi terbaru"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Layar kunci"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Setelan Cepat"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifikasi"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ambil screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Naikkan volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Turunkan volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Tingkatkan kecerahan"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Kurangi kecerahan"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Buka layar sebelumnya"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Buka layar berikutnya"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Aksesibilitas menyediakan menu di layar dengan ukuran besar untuk mengontrol perangkat Anda. Anda dapat mengunci perangkat, mengontrol volume dan kecerahan, mengambil screenshot, dan banyak lagi."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrol perangkat melalui menu berukuran besar"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Setelan Menu Aksesibilitas"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Tombol besar"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Perbesar ukuran Tombol Menu Aksesibilitas"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Bantuan"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Kecerahan <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musik <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml new file mode 100644 index 000000000000..2a803c16d91c --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Aðgengisvalmynd"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Aðgengisvalmyndin er stór valmynd sem birtist á skjánum sem má nota til að stjórna tækinu. Þú getur læst tækinu, stjórnað hljóðstyrk og birtustigi, tekið skjámyndir og fleira."</string> + <string name="assistant_label" msgid="6796392082252272356">"Hjálpari"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Aðgengisstillingar"</string> + <string name="volume_label" msgid="3682221827627150574">"Hljóðstyrkur"</string> + <string name="volume_utterance" msgid="408291570329066290">"Stýringar hljóðstyrks"</string> + <string name="power_label" msgid="7699720321491287839">"Orka"</string> + <string name="power_utterance" msgid="7444296686402104807">"Orkuvalkostir"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nýleg forrit"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lásskjár"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Flýtistillingar"</string> + <string name="notifications_label" msgid="6829741046963013567">"Tilkynningar"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skjámynd"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Taka skjámynd"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Hækka hljóð"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Lækka hljóð"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Auka birtustig"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Minnka birtustig"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Fara á fyrri skjá"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Fara á næsta skjá"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Aðgengisvalmyndin er stór valmynd sem birtist á skjánum sem má nota til að stjórna tækinu. Þú getur læst tækinu, stjórnað hljóðstyrk og birtustigi, tekið skjámyndir og fleira."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Stjórna tæki í gegnum stóra valmynd"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Aðgengisvalmyndarstillingar"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Stórir hnappar"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Stækka hnappa aðgengisvalmyndar"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hjálp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Birtustig <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Hljóðstyrkur tónlistar <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml new file mode 100644 index 000000000000..cef36771f1d7 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Accessibilità"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Il Menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistente"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Impostazioni di accessibilità"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controlli del volume"</string> + <string name="power_label" msgid="7699720321491287839">"Accensione"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opzioni di accensione"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"App recenti"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Schermata di blocco"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Impostazioni rapide"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notifiche"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Acquisisci screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Alza il volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Abbassa il volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumenta luminosità"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Diminuisci luminosità"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Vai alla schermata precedente"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Vai alla schermata successiva"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Il Menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlla il dispositivo tramite un menu di grandi dimensioni"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Impostazioni del menu Accessibilità"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Pulsanti grandi"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta le dimensioni dei pulsanti del menu Accessibilità"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Guida"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosità: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musica: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml new file mode 100644 index 000000000000..6335e969e541 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"תפריט נגישות"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"תפריט הנגישות הוא תפריט גדול שמופיע במסך ומאפשר לשלוט במכשיר. אפשר לנעול את המכשיר, לשלוט בעוצמת הקול ובבהירות, לצלם צילומי מסך ועוד."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"הגדרות נגישות"</string> + <string name="volume_label" msgid="3682221827627150574">"עוצמת הקול"</string> + <string name="volume_utterance" msgid="408291570329066290">"שליטה בעוצמת הקול"</string> + <string name="power_label" msgid="7699720321491287839">"הפעלה"</string> + <string name="power_utterance" msgid="7444296686402104807">"אפשרויות הפעלה"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"אפליקציות אחרונות"</string> + <string name="lockscreen_label" msgid="648347953557887087">"מסך נעילה"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"הגדרות מהירות"</string> + <string name="notifications_label" msgid="6829741046963013567">"התראות"</string> + <string name="screenshot_label" msgid="863978141223970162">"צילום מסך"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"שמירת צילום של המסך"</string> + <string name="volume_up_label" msgid="8592766918780362870">"הגברת עוצמת הקול"</string> + <string name="volume_down_label" msgid="8574981863656447346">"החלשת עוצמת הקול"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"הגברת הבהירות"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"הפחתת הבהירות"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"מעבר למסך הקודם"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"מעבר למסך הבא"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"תפריט הנגישות הוא תפריט גדול שמופיע במסך ומאפשר לשלוט במכשיר. אפשר לנעול את המכשיר, לשלוט בעוצמת הקול ובבהירות, לצלם צילומי מסך ועוד."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"שליטה במכשיר באמצעות התפריט הגדול"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"הגדרות של תפריט נגישות"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"לחצנים גדולים"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"הגדלת הלחצנים של תפריט הנגישות"</string> + <string name="pref_help_title" msgid="6871558837025010641">"עזרה"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"בהירות %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"עוצמת הקול של המוזיקה %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml new file mode 100644 index 000000000000..d5ef005503a5 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ユーザー補助機能メニュー"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ユーザー補助メニューは、デバイスを操作するための画面上の大きなメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string> + <string name="assistant_label" msgid="6796392082252272356">"アシスタント"</string> + <string name="assistant_utterance" msgid="65509599221141377">"アシスタント"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"ユーザー補助機能の設定"</string> + <string name="volume_label" msgid="3682221827627150574">"音量"</string> + <string name="volume_utterance" msgid="408291570329066290">"音量を調節"</string> + <string name="power_label" msgid="7699720321491287839">"電源"</string> + <string name="power_utterance" msgid="7444296686402104807">"電源オプション"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"最近使ったアプリ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ロック画面"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"クイック設定"</string> + <string name="notifications_label" msgid="6829741046963013567">"通知"</string> + <string name="screenshot_label" msgid="863978141223970162">"スクリーンショット"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"スクリーンショットを撮る"</string> + <string name="volume_up_label" msgid="8592766918780362870">"音量を上げる"</string> + <string name="volume_down_label" msgid="8574981863656447346">"音量を下げる"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"明るさを上げる"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"明るさを下げる"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"前の画面に移動"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"次の画面に移動"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ユーザー補助メニューは、デバイスを操作するための画面上の大きなメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"大きなメニューでデバイスを操作します"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ユーザー補助機能メニューの設定"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大きいボタン"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ユーザー補助機能メニューのボタンを大きくする"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ヘルプ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"明るさ <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"音楽の音量 <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml new file mode 100644 index 000000000000..3ba5adc4f88b --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"მარტივი წვდომის მენიუ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"მარტივი წვდომის მენიუ გთავაზობთ ვრცელ, ეკრანულ მენიუს მოწყობილობის სამართავად. თქვენ შეგიძლიათ, ჩაკეტოთ მოწყობილობა, მართოთ ხმის სიმძლავრე და სიკაშკაშე, გადაიღოთ ეკრანის ანაბეჭდები და ა.შ."</string> + <string name="assistant_label" msgid="6796392082252272356">"ასისტენტი"</string> + <string name="assistant_utterance" msgid="65509599221141377">"ასისტენტი"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"მარტივი წვდომის პარამეტრები"</string> + <string name="volume_label" msgid="3682221827627150574">"ხმა"</string> + <string name="volume_utterance" msgid="408291570329066290">"ხმის მართვის საშუალებები"</string> + <string name="power_label" msgid="7699720321491287839">"ელკვება"</string> + <string name="power_utterance" msgid="7444296686402104807">"ელკვების ვარიანტები"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ბოლოდროინდელი აპები"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ჩაკეტილი ეკრანი"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"სწრაფი პარამეტრები"</string> + <string name="notifications_label" msgid="6829741046963013567">"შეტყობინებები"</string> + <string name="screenshot_label" msgid="863978141223970162">"ეკრანის ანაბეჭდი"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ეკრანის ანაბეჭდის გადაღება"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ხმის აწევა"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ხმის დაწევა"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"სიკაშკაშის მომატება"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"სიკაშკაშის დაკლება"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"წინა ეკრანზე გადასვლა"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"შემდეგ ეკრანზე გადასვლა"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"მარტივი წვდომის მენიუ გთავაზობთ ვრცელ, ეკრანულ მენიუს მოწყობილობის სამართავად. თქვენ შეგიძლიათ, ჩაკეტოთ მოწყობილობა, მართოთ ხმის სიმძლავრე და სიკაშკაშე, გადაიღოთ ეკრანის ანაბეჭდები და ა.შ."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"მართეთ მოწყობილობა დიდი მენიუს მეშვეობით"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"მარტივი წვდომის მენიუს პარამეტრები"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"დიდი ღილაკები"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"მარტივი წვდომის მენიუს ღილაკების ზომის გაზრდა"</string> + <string name="pref_help_title" msgid="6871558837025010641">"დახმარება"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"სიკაშკაშე: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"მუსიკის ხმა: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml new file mode 100644 index 000000000000..b7fbaa89eb9a --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Арнайы мүмкіндіктер мәзірі"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Арнайы мүмкіндіктер мәзірінде құрылғыны басқаруға арналған үлкейтілген экран мәзірі бар. Ол арқылы құрылғыны құлыптай, дыбыс деңгейі мен түс ашықтығын басқара, скриншот түсіре және т.б. әрекеттерді орындай аласыз."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Арнайы мүмкіндіктер параметрлері"</string> + <string name="volume_label" msgid="3682221827627150574">"Дыбыс деңгейі"</string> + <string name="volume_utterance" msgid="408291570329066290">"Дыбыс деңгейін басқару элементтері"</string> + <string name="power_label" msgid="7699720321491287839">"Қуат түймесі"</string> + <string name="power_utterance" msgid="7444296686402104807">"Қуат түймесінің опциялары"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Соңғы пайдаланылған қолданбалар"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Құлып экраны"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Жылдам параметрлер"</string> + <string name="notifications_label" msgid="6829741046963013567">"Хабарландырулар"</string> + <string name="screenshot_label" msgid="863978141223970162">"Скриншот"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Скриншот жасау"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Дыбысын арттыру"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Дыбысын азайту"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Жарықтығын арттыру"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Жарықтығын азайту"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Алдыңғы экранға өту"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Келесі экранға өту"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Арнайы мүмкіндіктер мәзірінде құрылғыны басқаруға арналған үлкейтілген экран мәзірі бар. Ол арқылы құрылғыны құлыптай, дыбыс деңгейі мен түс ашықтығын басқара, скриншот түсіре және т. б. әрекеттерді орындай аласыз."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Құрылғыны үлкейтілген экран мәзірі арқылы басқару"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Арнайы мүмкіндіктер мәзірі параметрлері"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Үлкен түймелер"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"\"Арнайы мүмкіндіктер\" мәзірі түймелерін үлкейту"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Анықтама"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Жарықтығы: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Музыканың дыбыс қаттылығы: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml new file mode 100644 index 000000000000..6bd12748d560 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ម៉ឺនុយភាពងាយស្រួល"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ម៉ឺនុយភាពងាយស្រួលផ្ដល់ម៉ឺនុយធំនៅលើអេក្រង់ ដើម្បីគ្រប់គ្រងឧបករណ៍របស់អ្នក។ អ្នកអាចចាក់សោឧបករណ៍របស់អ្នក គ្រប់គ្រងកម្រិតសំឡេងនិងពន្លឺ ថតរូបអេក្រង់ និងអ្វីៗច្រើនទៀត។"</string> + <string name="assistant_label" msgid="6796392082252272356">"ជំនួយការ"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ការកំណត់ភាពងាយស្រួល"</string> + <string name="volume_label" msgid="3682221827627150574">"កម្រិតសំឡេង"</string> + <string name="volume_utterance" msgid="408291570329066290">"ការគ្រប់គ្រងកម្រិតសំឡេង"</string> + <string name="power_label" msgid="7699720321491287839">"ថាមពល"</string> + <string name="power_utterance" msgid="7444296686402104807">"ជម្រើសថាមពល"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"កម្មវិធីថ្មីៗ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"អេក្រង់ចាក់សោ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ការកំណត់រហ័ស"</string> + <string name="notifications_label" msgid="6829741046963013567">"ការជូនដំណឹង"</string> + <string name="screenshot_label" msgid="863978141223970162">"រូបថតអេក្រង់"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ថតរូបថតអេក្រង់"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ដំឡើងកម្រិតសំឡេង"</string> + <string name="volume_down_label" msgid="8574981863656447346">"បន្ថយកម្រិតសំឡេង"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"បង្កើនពន្លឺ"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"បន្ថយពន្លឺ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ចូលទៅកាន់អេក្រង់មុន"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ចូលទៅកាន់អេក្រង់បន្ទាប់"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ម៉ឺនុយភាពងាយស្រួលផ្ដល់ម៉ឺនុយធំនៅលើអេក្រង់ ដើម្បីគ្រប់គ្រងឧបករណ៍របស់អ្នក។ អ្នកអាចចាក់សោឧបករណ៍របស់អ្នក គ្រប់គ្រងកម្រិតសំឡេងនិងពន្លឺ ថតរូបអេក្រង់ និងអ្វីៗច្រើនទៀត។"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"គ្រប់គ្រងឧបករណ៍តាមរយៈម៉ឺនុយធំ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ការកំណត់ម៉ឺនុយភាពងាយស្រួល"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ប៊ូតុងធំ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"បង្កើនទំហំប៊ូតុងម៉ឺនុយភាពងាយស្រួល"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ជំនួយ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ពន្លឺ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"កម្រិតសំឡេងតន្ត្រី <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml new file mode 100644 index 000000000000..627cfc135a7e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಯಂತ್ರಿಸುವುದಕ್ಕಾಗಿ ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವನ್ನು ಮಾಡಬಹುದು."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="volume_label" msgid="3682221827627150574">"ಧ್ವನಿಯ ಶಕ್ತಿ"</string> + <string name="volume_utterance" msgid="408291570329066290">"ಧ್ವನಿಯ ಶಕ್ತಿಯ ನಿಯಂತ್ರಕಗಳು"</string> + <string name="power_label" msgid="7699720321491287839">"ಪವರ್ ಬಟನ್"</string> + <string name="power_utterance" msgid="7444296686402104807">"ಪವರ್ ಆಯ್ಕೆಗಳು"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ಲಾಕ್ ಪರದೆ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="notifications_label" msgid="6829741046963013567">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="screenshot_label" msgid="863978141223970162">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ವಾಲ್ಯೂಮ್ ಜಾಸ್ತಿ"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ವಾಲ್ಯೂಮ್ ಕಡಿಮೆ"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ಪ್ರಖರತೆ ಹೆಚ್ಚು ಮಾಡಿ"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ಪ್ರಖರತೆ ಕಡಿಮೆ ಮಾಡಿ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ಹಿಂದಿನ ಸ್ಕ್ರೀನ್ಗೆ ಹೋಗಿ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ಮುಂದಿನ ಸ್ಕ್ರೀನ್ಗೆ ಹೋಗಿ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲು ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಬಹುದು."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ದೊಡ್ಡ ಮೆನುವಿನ ಮೂಲಕ ಸಾಧನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ದೊಡ್ಡ ಬಟನ್ಗಳು"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ಬಟನ್ಗಳ ಗಾತ್ರವನ್ನು ಹೆಚ್ಚಿಸಿ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ಸಹಾಯ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ಪ್ರಕಾಶಮಾನ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ಸಂಗೀತ ವಾಲ್ಯೂಮ್ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml new file mode 100644 index 000000000000..f2495f01b25c --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"접근성 메뉴"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"접근성 메뉴를 사용하면 화면에 크게 표시되는 메뉴로 기기를 제어할 수 있습니다. 기기 잠금, 볼륨 및 밝기 조절, 스크린샷 찍기 등의 작업이 지원됩니다."</string> + <string name="assistant_label" msgid="6796392082252272356">"어시스턴트"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"접근성 설정"</string> + <string name="volume_label" msgid="3682221827627150574">"볼륨"</string> + <string name="volume_utterance" msgid="408291570329066290">"볼륨 조정"</string> + <string name="power_label" msgid="7699720321491287839">"전원"</string> + <string name="power_utterance" msgid="7444296686402104807">"전원 옵션"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"최근 앱"</string> + <string name="lockscreen_label" msgid="648347953557887087">"잠금 화면"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"빠른 설정"</string> + <string name="notifications_label" msgid="6829741046963013567">"알림"</string> + <string name="screenshot_label" msgid="863978141223970162">"스크린샷"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"스크린샷 촬영"</string> + <string name="volume_up_label" msgid="8592766918780362870">"볼륨 크게"</string> + <string name="volume_down_label" msgid="8574981863656447346">"볼륨 작게"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"밝기 높이기"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"밝기 낮추기"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"이전 화면으로 이동"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"다음 화면으로 이동"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"접근성 메뉴를 사용하면 화면에 크게 표시되는 메뉴로 기기를 제어할 수 있습니다. 기기 잠금, 볼륨 및 밝기 조절, 스크린샷 찍기 등의 작업이 지원됩니다."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"큰 메뉴로 기기 제어"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"접근성 메뉴 설정"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"큰 버튼"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"접근성 메뉴 버튼 크기 늘리기"</string> + <string name="pref_help_title" msgid="6871558837025010641">"도움말"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"밝기 <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"음악 볼륨 <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml new file mode 100644 index 000000000000..c376cf46280e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Атайын мүмкүнчүлүктөр менюсу"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Атайын мүмкүнчүлүктөр менюсу аркылуу түзмөгүңүздү кулпулап, үнүн катуулатып/акырындатып, экрандын жарык деңгээлин тууралап, скриншот тартып жана башка нерселерди жасай аласыз."</string> + <string name="assistant_label" msgid="6796392082252272356">"Жардамчы"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Атайын мүмкүнчүлүктөрдүн параметрлери"</string> + <string name="volume_label" msgid="3682221827627150574">"Үндүн катуулугу"</string> + <string name="volume_utterance" msgid="408291570329066290">"Үндү башкаруу элементтери"</string> + <string name="power_label" msgid="7699720321491287839">"Кубат"</string> + <string name="power_utterance" msgid="7444296686402104807">"Кубат параметрлери"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Акыркы колдонмолор"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Кулпуланган экран"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Ыкчам жөндөөлөр"</string> + <string name="notifications_label" msgid="6829741046963013567">"Билдирмелер"</string> + <string name="screenshot_label" msgid="863978141223970162">"Скриншот"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Скриншот тартып алуу"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Катуулатуу"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Акырындатуу"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Жарыктыгын көбөйтүү"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Күңүртүрөөк"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Мурунку экранга өтүү"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Кийинки экранга өтүү"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Атайын мүмкүнчүлүктөр менюсу — бул түзмөгүңүздү көзөмөлдөөнү жеңилдетүүгө ылайыкташтырылган экрандагы чоң меню. Түзмөгүңүздү кулпулап, үнүнүн катуулугун жана экрандын жарыктыгын көзөмөлдөп, скриншотторду тартып жана башка аракеттерди аткара аласыз."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Түзмөктү чоң менюдан башкаруу"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Атайын мүмкүнчүлүктөр менюсунун параметрлери"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Чоң баскычтар"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Атайын мүмкүнчүлүктөр менюсундагы баскычтардын өлчөмүн чоңойтот"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Жардам"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Жарыктыгы <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Музыканын үнүнүн катуулугу <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml new file mode 100644 index 000000000000..85891a96ec60 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ເມນູການຊ່ວຍເຂົ້າເຖິງ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ເມນູການຊ່ວຍເຂົ້າເຖິງຈະສະໜອງເມນູຢູ່ໜ້າຈໍຂະໜາດໃຫຍ່ເພື່ອຄວບຄຸມອຸປະກອນຂອງທ່ານ. ທ່ານສາມາດລັອກອຸປະກອນຂອງທ່ານ, ຄວບຄຸມລະດັບສຽງ ແລະ ຄວາມສະຫວ່າງ, ຖ່າຍຮູບໜ້າຈໍ ແລະ ອື່ນໆໄດ້."</string> + <string name="assistant_label" msgid="6796392082252272356">"ຜູ້ຊ່ວຍ"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ການຕັ້ງຄ່າການຊ່ວຍເຂົ້າເຖິງ"</string> + <string name="volume_label" msgid="3682221827627150574">"ລະດັບສຽງ"</string> + <string name="volume_utterance" msgid="408291570329066290">"ຕົວຄວບຄຸມລະດັບສຽງ"</string> + <string name="power_label" msgid="7699720321491287839">"ພະລັງງານ"</string> + <string name="power_utterance" msgid="7444296686402104807">"ຕົວເລືອກພະລັງງານ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ແອັບຫຼ້າສຸດ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ໜ້າຈໍລັອກ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ການຕັ້ງຄ່າດ່ວນ"</string> + <string name="notifications_label" msgid="6829741046963013567">"ການແຈ້ງເຕືອນ"</string> + <string name="screenshot_label" msgid="863978141223970162">"ຮູບໜ້າຈໍ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ຖ່າຍຮູບໜ້າຈໍ"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ເພີ່ມສຽງຂຶ້ນ"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ຄ່ອຍສຽງລົງ"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ເພີ່ມຄວາມສະຫວ່າງຂຶ້ນ"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ຫຼຸດຄວາມສະຫວ່າງລົງ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ໄປທີ່ໜ້າຈໍກ່ອນໜ້າ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ໄປທີ່ໜ້າຈໍຖັດໄປ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ເມນູການຊ່ວຍເຂົ້າເຖິງຈະສະໜອງເມນູຢູ່ໜ້າຈໍຂະໜາດໃຫຍ່ເພື່ອຄວບຄຸມອຸປະກອນຂອງທ່ານ. ທ່ານສາມາດລັອກອຸປະກອນຂອງທ່ານ, ຄວບຄຸມລະດັບສຽງ ແລະ ຄວາມສະຫວ່າງ, ຖ່າຍຮູບໜ້າຈໍ ແລະ ອື່ນໆໄດ້."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ຄວບຄຸມອຸປະກອນຜ່ານເມນູໃຫຍ່"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ການຕັ້ງຄ່າເມນູການຊ່ວຍເຂົ້າເຖິງ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ປຸ່ມໃຫຍ່"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ເພີ່ມຂະໜາດຂອງປຸ່ມເມນູການຊ່ວຍເຂົ້າເຖິງ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ຊ່ວຍເຫຼືອ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ຄວາມສະຫວ່າງ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ລະດັບສຽງເພງ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml new file mode 100644 index 000000000000..b4d804c5bab4 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Pritaikymo neįgaliesiems meniu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Naudodami pritaikomumo meniu galite atidaryti didelį ekrane pateikiamą meniu, skirtą įrenginiui valdyti. Galite užrakinti įrenginį, valdyti garsumą ir šviesumą, užfiksuoti ekrano kopijas ir atlikti kitus veiksmus."</string> + <string name="assistant_label" msgid="6796392082252272356">"Padėjėjas"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Padėjėjas"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Pritaikymo neįgaliesiems nustatymai"</string> + <string name="volume_label" msgid="3682221827627150574">"Garsumas"</string> + <string name="volume_utterance" msgid="408291570329066290">"Garsumo valdikliai"</string> + <string name="power_label" msgid="7699720321491287839">"Maitinimas"</string> + <string name="power_utterance" msgid="7444296686402104807">"Maitinimo parinktys"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Naujausios programos"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Užrakinimo ekranas"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Spartieji nustatymai"</string> + <string name="notifications_label" msgid="6829741046963013567">"Pranešimai"</string> + <string name="screenshot_label" msgid="863978141223970162">"Ekrano kopija"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Padaryti ekrano kopiją"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Garsumo didinimas"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Garsumo mažinimas"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Šviesumo didinimas"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Šviesumo mažinimas"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Eiti į ankstesnį ekraną"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Eiti į kitą ekraną"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Naudodami pritaikomumo meniu galite atidaryti didelį ekrane pateikiamą meniu, skirtą įrenginiui valdyti. Galite užrakinti įrenginį, valdyti garsumą ir šviesumą, užfiksuoti ekrano kopijas ir atlikti kitus veiksmus."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Valdykite įrenginį naudodami didelį meniu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Pritaikymo neįgaliesiems meniu nustatymai"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Dideli mygtukai"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Padidinti pritaikymo neįgaliesiems meniu mygtukų dydį"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pagalba"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Šviesumas: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Muzikos garsumas: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml new file mode 100644 index 000000000000..a40b52598e33 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Pieejamības izvēlne"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Pieejamības izvēlne ir liela ekrāna izvēlne, ar ko varat kontrolēt ierīci. Varat bloķēt ierīci, kontrolēt skaļumu un spilgtumu, veidot ekrānuzņēmumus un paveikt daudz ko citu."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistents"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Pieejamības iestatījumi"</string> + <string name="volume_label" msgid="3682221827627150574">"Skaļums"</string> + <string name="volume_utterance" msgid="408291570329066290">"Skaļuma vadīklas"</string> + <string name="power_label" msgid="7699720321491287839">"Barošana"</string> + <string name="power_utterance" msgid="7444296686402104807">"Barošanas opcijas"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Pēdējās izmantotās lietotnes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Bloķēšanas ekrāns"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Ātrie iestatījumi"</string> + <string name="notifications_label" msgid="6829741046963013567">"Paziņojumi"</string> + <string name="screenshot_label" msgid="863978141223970162">"Ekrānuzņēmums"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Izveidot ekrānuzņēmumu"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Palielināt skaļumu"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Samazināt skaļumu"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Palielināt spilgtumu"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Samazināt spilgtumu"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Pāriet uz iepriekšējo ekrānu"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Pāriet uz nākamo ekrānu"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Pieejamības izvēlne nodrošina lielu ekrāna izvēlni, ko varat izmantot ierīces kontrolēšanai. Varat bloķēt ierīci, kontrolēt skaļumu un spilgtumu, veidot ekrānuzņēmumus un paveikt daudz ko citu."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrolējiet ierīci, izmantojot lielu izvēlni"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Pieejamības izvēlnes iestatījumi"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Lielas pogas"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Palielināt pieejamības izvēlnes pogu lielumu"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Palīdzība"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Spilgtums: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Mūzikas skaļums: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml new file mode 100644 index 000000000000..4a710cc161f8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Мени за пристапност"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"„Менито за пристапност“ ви овозможува да го контролирате уредот преку големо мени на екранот. Може да го заклучите уредот, да ги контролирате јачината на звукот и осветленоста, да правите слики од екранот и друго."</string> + <string name="assistant_label" msgid="6796392082252272356">"Помошник"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Пристапност"</string> + <string name="volume_label" msgid="3682221827627150574">"Јачина на звук"</string> + <string name="volume_utterance" msgid="408291570329066290">"Контроли за јачина на звук"</string> + <string name="power_label" msgid="7699720321491287839">"Напојување"</string> + <string name="power_utterance" msgid="7444296686402104807">"Опции за напојување"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Неодамнешни апликации"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Заклучен екран"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Брзи поставки"</string> + <string name="notifications_label" msgid="6829741046963013567">"Известувања"</string> + <string name="screenshot_label" msgid="863978141223970162">"Слика од екранот"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Направи слика од екранот"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Зголеми звук"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Намали звук"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Осветлете"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Затемнете"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Оди на претходниот екран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Оди на следниот екран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"„Менито за пристапност“ ви овозможува да го контролирате уредот преку големо мени на екранот. Може да го заклучите уредот, да ги контролирате јачината на звукот и осветленоста, да правите слики од екранот и друго."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Контролирајте го уредот преку големо мени"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Поставки за мени за прист."</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Големи копчиња"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Зголеми ги копчињата на менито за пристапност"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Помош"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Осветленост <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Јачина на звук за музика <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml new file mode 100644 index 000000000000..38471e12b70a --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ഉപയോഗസഹായി മെനു"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നതിന്, ഉപയോഗസഹായി മെനു വലിയൊരു ഓൺ-സ്ക്രീൻ മെനു നൽകുന്നു. ഉപകരണം ലോക്ക് ചെയ്യാനും ശബ്ദവും തെളിച്ചവും നിയന്ത്രിക്കാനും സ്ക്രീൻ ഷോട്ടുകൾ എടുക്കാനും മറ്റും നിങ്ങൾക്ക് കഴിയും."</string> + <string name="assistant_label" msgid="6796392082252272356">"അസിസ്റ്റന്റ്"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"പ്രവേശനക്ഷമത ക്രമീകരണം"</string> + <string name="volume_label" msgid="3682221827627150574">"വോളിയം"</string> + <string name="volume_utterance" msgid="408291570329066290">"വോളിയം നിയന്ത്രണങ്ങൾ"</string> + <string name="power_label" msgid="7699720321491287839">"പവർ"</string> + <string name="power_utterance" msgid="7444296686402104807">"പവർ ഓപ്ഷനുകൾ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"സമീപകാല ആപ്പുകൾ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ലോക്ക് സ്ക്രീൻ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ദ്രുത ക്രമീകരണം"</string> + <string name="notifications_label" msgid="6829741046963013567">"അറിയിപ്പുകൾ"</string> + <string name="screenshot_label" msgid="863978141223970162">"സ്ക്രീൻഷോട്ട്"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"സ്ക്രീന്ഷോട്ട് എടുക്കുക"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ശബ്ദം കൂട്ടുക"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ശബ്ദം കുറയ്ക്കുക"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"തെളിച്ചം കൂട്ടുക"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"തെളിച്ചം കുറയ്ക്കുക"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"മുമ്പത്തെ സ്ക്രീനിലേക്ക് പോവുക"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"അടുത്ത സ്ക്രീനിലേക്ക് പോവുക"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നതിന്, ഉപയോഗസഹായി മെനു വലിയൊരു ഓൺ-സ്ക്രീൻ മെനു നൽകുന്നു. ഉപകരണം ലോക്ക് ചെയ്യാനും ശബ്ദവും തെളിച്ചവും നിയന്ത്രിക്കാനും സ്ക്രീൻ ഷോട്ടുകൾ എടുക്കാനും മറ്റും നിങ്ങൾക്ക് കഴിയും."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"വലിയ മെനുവിലൂടെ ഉപകരണം നിയന്ത്രിക്കുക"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ഉപയോഗസഹായി മെനു ക്രമീകരണം"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"വലിയ ബട്ടണുകൾ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ഉപയോഗസഹായി മെനു ബട്ടണുകളുടെ വലുപ്പം കൂട്ടുക"</string> + <string name="pref_help_title" msgid="6871558837025010641">"സഹായം"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"തെളിച്ചം, <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"സംഗീത ശബ്ദം, <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml new file mode 100644 index 000000000000..7c54d556e244 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Хандалтын цэс"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Хандалтын цэс нь танд төхөөрөмжөө том дэлгэцийн цэсээр хянах боломжийг олгоно. Та төхөөрөмжөө түгжих, дууны түвшин болон гэрэлтүүлгийг хянах, дэлгэцийн агшин авах болон бусад үйлдлийг хийж болно."</string> + <string name="assistant_label" msgid="6796392082252272356">"Туслах"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Хүртээмжийн тохиргоо"</string> + <string name="volume_label" msgid="3682221827627150574">"Түвшин"</string> + <string name="volume_utterance" msgid="408291570329066290">"Түвшний хяналт"</string> + <string name="power_label" msgid="7699720321491287839">"Асаах/унтраах"</string> + <string name="power_utterance" msgid="7444296686402104807">"Асаах/унтраах сонголт"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Саяхны апп"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Түгжигдсэн дэлгэц"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Шуурхай тохиргоо"</string> + <string name="notifications_label" msgid="6829741046963013567">"Мэдэгдэл"</string> + <string name="screenshot_label" msgid="863978141223970162">"Дэлгэцний зургийг дарах"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Дэлгэцний зургийг дарах"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Дууны түвшнийг нэмэх"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Дууны түвшнийг багасгах"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Гэрэлтүүлгийг нэмэх"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Гэрэлтүүлгийг бууруулах"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Өмнөх дэлгэц рүү очих"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Дараагийн дэлгэц рүү очих"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Хандалтын цэс нь танд төхөөрөмжөө том дэлгэцийн цэсээр хянах боломжийг олгоно. Та төхөөрөмжөө түгжих, дууны түвшин болон гэрэлтүүлгийг хянах, дэлгэцийн агшин авах болон бусад үйлдлийг хийж болно."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Төхөөрөмжийг том цэсээр хянана уу"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Хандалтын цэсийн тохиргоо"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Том товчлуур"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Хандалтын цэсний товчлуурын хэмжээг томруулах"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Тусламж"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Гэрэлтүүлэг <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Хөгжмийн дууны түвшин <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml new file mode 100644 index 000000000000..4497e9cae17d --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"अॅक्सेसिबिलिटी मेनू"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"तुमचे डिव्हाइस नियंत्रित करण्यासाठी अॅक्सेसिबिलिटी मेनू मोठा स्क्रीनवरील मेनू पुरवतो. तुम्ही तुमचे डिव्हाइस लॉक करणे, व्हॉल्यूम आणि ब्राइटनेस नियंत्रित करणे, स्क्रीनशॉट घेणे आणि आणखी बरेच काही करू शकता."</string> + <string name="assistant_label" msgid="6796392082252272356">"असिस्टंट"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"अॅक्सेसिबिलिटी सेटिंग्ज"</string> + <string name="volume_label" msgid="3682221827627150574">"व्हॉल्यूम"</string> + <string name="volume_utterance" msgid="408291570329066290">"व्हॉल्यूम नियंत्रणे"</string> + <string name="power_label" msgid="7699720321491287839">"पॉवर"</string> + <string name="power_utterance" msgid="7444296686402104807">"पॉवर पर्याय"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"अलीकडील अॅप्स"</string> + <string name="lockscreen_label" msgid="648347953557887087">"लॉक स्क्रीन"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"क्विक सेटिंग्ज"</string> + <string name="notifications_label" msgid="6829741046963013567">"सूचना"</string> + <string name="screenshot_label" msgid="863978141223970162">"स्क्रीनशॉट"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"स्क्रीनशॉट घ्या"</string> + <string name="volume_up_label" msgid="8592766918780362870">"व्हॉल्यूम वाढवा"</string> + <string name="volume_down_label" msgid="8574981863656447346">"व्हॉल्यूम कमी करा"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ब्राइटनेस वाढवा"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"कमी ब्राइटनेस"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"मागील स्क्रीनवर जा"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"पुढील स्क्रीनवर जा"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"तुमचे डिव्हाइस नियंत्रित करण्यासाठी अॅक्सेसिबिलिटी मेनू मोठा स्क्रीनवरील मेनू पुरवतो. तुम्ही तुमचे डिव्हाइस लॉक करणे, व्हॉल्यूम आणि ब्राइटनेस नियंत्रित करणे, स्क्रीनशॉट घेणे आणि आणखी बरेच काही करू शकता."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"मोठ्या मेनूद्वारे डिव्हाइस नियंत्रित करा"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"अॅक्सेसिबिलिटी मेनू सेटिंग्ज"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"मोठी बटणे"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"अॅक्सेसिबिलिटी मेनू बटणांचा आकार वाढवा"</string> + <string name="pref_help_title" msgid="6871558837025010641">"मदत"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ब्राइटनेस <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"गाण्याचा व्हॉल्यूम <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml new file mode 100644 index 000000000000..64a31513c81e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Kebolehaksesan"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Kebolehcapaian menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan banyak lagi."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Tetapan Kebolehaksesan"</string> + <string name="volume_label" msgid="3682221827627150574">"Kelantangan"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kawalan kelantangan"</string> + <string name="power_label" msgid="7699720321491287839">"Kuasa"</string> + <string name="power_utterance" msgid="7444296686402104807">"Pilihan kuasa"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Apl terbaharu"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Kunci skrin"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Tetapan Pantas"</string> + <string name="notifications_label" msgid="6829741046963013567">"Pemberitahuan"</string> + <string name="screenshot_label" msgid="863978141223970162">"Tangkapan skrin"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ambil tangkapan skrin"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Tambah kelantangan"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Kurangkan kelantangan"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Tambahkan kecerahan"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Kurangkan kecerahan"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Pergi ke skrin sebelumnya"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Pergi ke skrin seterusnya"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Kebolehcapaian menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan pelbagai lagi."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kawal peranti melalui menu besar"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Tetapan Menu Kebolehaksesan"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Butang besar"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Besarkan saiz Butang Menu Kebolehaksesan"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Bantuan"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Kecerahan <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Kelantangan muzik <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml new file mode 100644 index 000000000000..daeb106a91be --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"အများသုံးနိုင်မှု မီနူး"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"‘အများသုံးနိုင်မှု မီနူး’ တွင် သင့်စက်ပစ္စည်းကို စီမံရန် ကြီးမားသည့်ဖန်သားပြင်မီနူး ပါဝင်သည်။ စက်ပစ္စည်းလော့ခ်ချခြင်း၊ အသံအတိုးအကျယ်နှင့် အလင်းအမှောင် ထိန်းချုပ်ခြင်း၊ ဖန်သားပြင်ဓာတ်ပုံရိုက်ခြင်း စသည်တို့ ပြုလုပ်နိုင်သည်။"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"အများသုံးစွဲနိုင်မှု ဆက်တင်များ"</string> + <string name="volume_label" msgid="3682221827627150574">"အသံအတိုးအကျယ်"</string> + <string name="volume_utterance" msgid="408291570329066290">"အသံအတိုးအကျယ် ခလုတ်များ"</string> + <string name="power_label" msgid="7699720321491287839">"ပါဝါခလုတ်"</string> + <string name="power_utterance" msgid="7444296686402104807">"ပါဝါ ရွေးစရာများ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"လတ်တလောသုံး အက်ပ်များ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"လော့ခ်မျက်နှာပြင်"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"အမြန် ဆက်တင်များ"</string> + <string name="notifications_label" msgid="6829741046963013567">"အကြောင်းကြားချက်များ"</string> + <string name="screenshot_label" msgid="863978141223970162">"ဖန်သားပြင်ဓာတ်ပုံ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်ရန်"</string> + <string name="volume_up_label" msgid="8592766918780362870">"အသံချဲ့ခလုတ်"</string> + <string name="volume_down_label" msgid="8574981863656447346">"အသံတိုးခလုတ်"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"တောက်ပမှု တိုးမြှင့်ရန်"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"တောက်ပမှု လျှော့ချရန်"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ယခင် မျက်နှာပြင်သို့ သွားရန်"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"နောက်မျက်နှာပြင်သို့ ဆက်သွားရန်"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"‘အများသုံးနိုင်မှု မီနူး’ တွင် သင့်စက်ပစ္စည်းကို စီမံရန် ကြီးမားသည့်ဖန်သားပြင်မီနူး ပါဝင်သည်။ စက်ပစ္စည်းလော့ခ်ချခြင်း၊ အသံအတိုးအကျယ်နှင့် အလင်းအမှောင် ထိန်းချုပ်ခြင်း၊ ဖန်သားပြင်ဓာတ်ပုံရိုက်ခြင်း စသည်တို့ ပြုလုပ်နိုင်သည်။"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ကြီးမားသည့်မီးနူးဖြင့် စက်ပစ္စည်းကို စီမံနိုင်သည်"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"အများသုံးနိုင်မှု မီနူးဆက်တင်များ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ခလုတ်အကြီးများ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"\'အများသုံးနိုင်မှု မီနူး ခလုတ်များ\' ၏ အရွယ်အစားတိုးရန်"</string> + <string name="pref_help_title" msgid="6871558837025010641">"အကူအညီ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"တောက်ပမှု <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ဂီတသံ အတိုးအကျယ် <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml new file mode 100644 index 000000000000..ab4686aef5bc --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Tilgjengelighetsmeny"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Med Tilgjengelighet-menyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Tilgjengelighetsinnstillinger"</string> + <string name="volume_label" msgid="3682221827627150574">"Volum"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volumkontroller"</string> + <string name="power_label" msgid="7699720321491287839">"Av/på"</string> + <string name="power_utterance" msgid="7444296686402104807">"Av/på-alternativer"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nylige apper"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Låseskjerm"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Hurtiginnstillinger"</string> + <string name="notifications_label" msgid="6829741046963013567">"Varsler"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skjermdump"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ta skjermdump"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volum opp"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volum ned"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Lysstyrke opp"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Lysstyrke ned"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Gå til forrige skjerm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Gå til neste skjerm"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Med Tilgjengelighet-menyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontroller enheten med en stor meny"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Innstillinger for Tilgjengelighetsmeny"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Store knapper"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Få større knapper i Tilgjengelighetsmeny"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hjelp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Lysstyrke <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musikkvolum <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml new file mode 100644 index 000000000000..82b6285871a6 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"एक्सेसिबिलिटी मेनु"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"तपाईं आफ्नो डिभाइस नियन्त्रण गर्न एक्सेसिबिलिटी मेनुमा गई ठुलो अन स्क्रिन मेनु खोल्न सक्नुहुन्छ। तपाईं आफ्नो डिभाइस लक गर्न, भोल्युम र चमक नियन्त्रण गर्न, स्क्रिनसटहरू लिन र थप कार्यहरू गर्न सक्नुहुन्छ।"</string> + <string name="assistant_label" msgid="6796392082252272356">"सहायक"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"पहुँचसम्बन्धी सेटिङहरू"</string> + <string name="volume_label" msgid="3682221827627150574">"भोल्युम"</string> + <string name="volume_utterance" msgid="408291570329066290">"भोल्युमका नियन्त्रणहरू"</string> + <string name="power_label" msgid="7699720321491287839">"पावर बटन"</string> + <string name="power_utterance" msgid="7444296686402104807">"पावर बटनका विकल्पहरू"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"हालका एपहरू"</string> + <string name="lockscreen_label" msgid="648347953557887087">"लक स्क्रिन"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"द्रुत सेटिङहरू"</string> + <string name="notifications_label" msgid="6829741046963013567">"सूचनाहरू"</string> + <string name="screenshot_label" msgid="863978141223970162">"स्क्रिनसट"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"स्क्रिनसट लिनुहोस्"</string> + <string name="volume_up_label" msgid="8592766918780362870">"भोल्युम बढाउनुहोस्"</string> + <string name="volume_down_label" msgid="8574981863656447346">"भोल्युम कम गर्नुहोस्"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"उज्यालो बढाउनुहोस्"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"उज्यालो कम गर्नुहोस्"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"अघिल्लो स्क्रिनमा जानुहोस्"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"अर्को स्क्रिनमा जानुहोस्"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"तपाईं आफ्नो डिभाइस नियन्त्रण गर्न एक्सेसिबिलिटी मेनुमा गई ठुलो अन स्क्रिन मेनु खोल्न सक्नुहुन्छ। तपाईं आफ्नो डिभाइस लक गर्न, भोल्युम र चमक नियन्त्रण गर्न, स्क्रिनसटहरू लिन र थप कार्यहरू गर्न सक्नुहुन्छ।"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ठुलो मेनुको सहायताले डिभाइस नियन्त्रण गर्नुहोस्"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"पहुँचसम्बन्धी मेनुका सेटिङहरू"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ठूला बटनहरू"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Accessibility मेनुका बटनहरूको आकार बढाउनुहोस्"</string> + <string name="pref_help_title" msgid="6871558837025010641">"मद्दत"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"चमक <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"सङ्गीतको भोल्युम <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml new file mode 100644 index 000000000000..1ddf6cfb8a20 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Toegankelijkheidsmenu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Het toegankelijkheidsmenu is een groot menu op het scherm waarmee je je apparaat kunt bedienen. Je kunt onder meer je apparaat vergrendelen, het volume en de helderheid beheren en screenshots maken."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Instellingen voor toegankelijkheid"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volumebediening"</string> + <string name="power_label" msgid="7699720321491287839">"Voeding"</string> + <string name="power_utterance" msgid="7444296686402104807">"Voedingsopties"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Recente apps"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Scherm vergrendelen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Snelle instellingen"</string> + <string name="notifications_label" msgid="6829741046963013567">"Meldingen"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Screenshot maken"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Volume omhoog"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Volume omlaag"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Helderheid verhogen"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Helderheid verlagen"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ga naar vorig scherm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ga naar volgend scherm"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Het toegankelijkheidsmenu is een groot menu op het scherm waarmee je je apparaat kunt bedienen. Je kunt onder meer je apparaat vergrendelen, het volume en de helderheid beheren en screenshots maken."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Apparaat bedienen via groot menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Instellingen toegankelijkheidsmenu"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Grote knoppen"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Knoppen in het toegankelijkheidsmenu vergroten"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hulp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Helderheid <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Muziekvolume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml new file mode 100644 index 000000000000..dd46ae471b14 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ଏକ ବଡ଼ ଅନ-ସ୍କ୍ରିନ ମେନୁ ପ୍ରଦାନ କରେ। ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଲକ କରିପାରିବେ, ଭଲ୍ୟୁମ ଓ ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ, ସ୍କ୍ରିନସଟ ନେଇପାରିବେ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରିପାରିବେ।"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ"</string> + <string name="volume_label" msgid="3682221827627150574">"ଭଲ୍ୟୁମ୍"</string> + <string name="volume_utterance" msgid="408291570329066290">"ଭଲ୍ୟୁମ୍ କଣ୍ଟ୍ରୋଲ୍"</string> + <string name="power_label" msgid="7699720321491287839">"ପାୱର୍"</string> + <string name="power_utterance" msgid="7444296686402104807">"ପାୱର୍ ବିକଳ୍ପ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ବର୍ତ୍ତମାନର ଆପ୍"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ସ୍କ୍ରୀନ୍ ଲକ୍ କରନ୍ତୁ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"କ୍ୱିକ ସେଟିଂସ"</string> + <string name="notifications_label" msgid="6829741046963013567">"ବିଜ୍ଞପ୍ତି"</string> + <string name="screenshot_label" msgid="863978141223970162">"ସ୍କ୍ରିନସଟ୍"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ସ୍କ୍ରୀନଶଟ୍ ନିଅନ୍ତୁ"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ଭଲ୍ୟୁମ୍ ବଢ଼ାନ୍ତୁ"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ଭଲ୍ୟୁମ୍ କମାନ୍ତୁ"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ଉଜ୍ଜ୍ୱଳତା ବଢ଼ାନ୍ତୁ"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ଉଜ୍ଜ୍ୱଳତା କମ୍ କରନ୍ତୁ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ପୂର୍ବବର୍ତ୍ତୀ ସ୍କ୍ରିନ୍କୁ ଯାଆନ୍ତୁ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ପରବର୍ତ୍ତୀ ସ୍କ୍ରିନ୍କୁ ଯାଆନ୍ତୁ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ଏକ ବଡ଼ ଅନ-ସ୍କ୍ରିନ ମେନୁ ପ୍ରଦାନ କରେ। ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଲକ କରିପାରିବେ, ଭଲ୍ୟୁମ ଓ ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ, ସ୍କ୍ରିନସଟ ନେଇପାରିବେ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରିପାରିବେ।"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ବଡ଼ ମେନୁ ମାଧ୍ୟମରେ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ସେଟିଂସ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ବଡ଼ ବଟନ୍"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ବଟନ୍ର ଆକାର ବଢ଼ାନ୍ତୁ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ସାହାଯ୍ୟ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ଉଜ୍ଜ୍ୱଳତା <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ସଙ୍ଗୀତର ଭଲ୍ୟୁମ୍ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml new file mode 100644 index 000000000000..4ff57c01bd0d --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ ਇੱਕ ਵੱਡਾ ਆਨ-ਸਕ੍ਰੀਨ ਮੀਨੂ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਅਵਾਜ਼ ਅਤੇ ਚਮਕ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ, ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈ ਸਕਦੇ ਹੋ ਅਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਕੁਝ।"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ਪਹੁੰਚਯੋਗਤਾ ਸੈਟਿੰਗਾਂ"</string> + <string name="volume_label" msgid="3682221827627150574">"ਅਵਾਜ਼"</string> + <string name="volume_utterance" msgid="408291570329066290">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string> + <string name="power_label" msgid="7699720321491287839">"ਪਾਵਰ"</string> + <string name="power_utterance" msgid="7444296686402104807">"ਪਾਵਰ ਵਿਕਲਪ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ਹਾਲੀਆ ਐਪਾਂ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ਲਾਕ ਸਕ੍ਰੀਨ"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ"</string> + <string name="notifications_label" msgid="6829741046963013567">"ਸੂਚਨਾਵਾਂ"</string> + <string name="screenshot_label" msgid="863978141223970162">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ਅਵਾਜ਼ ਵਧਾਓ"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ਅਵਾਜ਼ ਘਟਾਓ"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ਚਮਕ ਵਧਾਓ"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ਚਮਕ ਘਟਾਓ"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ਪਿਛਲੀ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਓ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ਅਗਲੀ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਓ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ ਇੱਕ ਵੱਡਾ ਸਕ੍ਰੀਨ-ਉੱਪਰਲਾ ਮੀਨੂ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਅਵਾਜ਼ ਅਤੇ ਚਮਕ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ, ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈ ਸਕਦੇ ਹੋ ਅਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਕੁਝ।"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ਵੱਡੇ ਮੀਨੂ ਰਾਹੀਂ ਡੀਵਾਈਸ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ ਸੈਟਿੰਗਾਂ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ਵੱਡੇ ਬਟਨ"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"\'ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ\' ਬਟਨਾਂ ਦਾ ਆਕਾਰ ਵਧਾਓ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ਮਦਦ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ਚਮਕ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ਸੰਗੀਤ ਦੀ ਅਵਾਜ਼ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml new file mode 100644 index 000000000000..829ab47fcde0 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu ułatwień dostępu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu ułatwień dostępu to duże menu ekranowe, które umożliwia obsługę urządzenia. Możesz zablokować urządzenie, zwiększyć lub zmniejszyć głośność oraz jasność, zrobić zrzut ekranu i wykonać inne działania."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asystent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Ustawienia ułatwień dostępu"</string> + <string name="volume_label" msgid="3682221827627150574">"Głośność"</string> + <string name="volume_utterance" msgid="408291570329066290">"Przyciski sterowania głośnością"</string> + <string name="power_label" msgid="7699720321491287839">"Zasilanie"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opcje przycisku zasilania"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Ostatnie aplikacje"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ekran blokady"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Szybkie ustawienia"</string> + <string name="notifications_label" msgid="6829741046963013567">"Powiadomienia"</string> + <string name="screenshot_label" msgid="863978141223970162">"Zrzut ekranu"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Zapisz zrzut ekranu"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Zwiększ głośność"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Zmniejsz głośność"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Zwiększ jasność"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Zmniejsz jasność"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Przejdź do poprzedniego ekranu"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Przejdź do następnego ekranu"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu ułatwień dostępu to duże menu ekranowe, które umożliwia obsługę urządzenia. Możesz zablokować urządzenie, zwiększyć lub zmniejszyć głośność oraz jasność, zrobić zrzut ekranu i wykonać inne działania."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Obsługuj urządzenie za pomocą dużego menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Ustawienia menu ułatwień dostępu"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Duże przyciski"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zwiększ rozmiar przycisków w menu Ułatwienia dostępu"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomoc"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Jasność: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Głośność muzyki: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000000..37f0980bbc55 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu de acessibilidade"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Google Assistente"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Configurações de acessibilidade"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controles de volume"</string> + <string name="power_label" msgid="7699720321491287839">"Liga/desliga"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opções do botão liga/desliga"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Tela de bloqueio"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Config. rápida"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificações"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de tela"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Fazer uma captura de tela"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Aumentar volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Diminuir volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar o brilho"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Diminuir o brilho"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir para tela anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir para a próxima tela"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlar o dispositivo com o menu grande"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Config. do menu de acessibilidade"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botões grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar o tamanho dos botões do menu de acessibilidade"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ajuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brilho: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume da música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml new file mode 100644 index 000000000000..da61be6e5721 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Acessibilidade"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"O menu Acessibilidade disponibiliza um menu grande no ecrã para controlar o dispositivo. Pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de ecrã e muito mais."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistente"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Definições de acessibilidade"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controlos do volume"</string> + <string name="power_label" msgid="7699720321491287839">"Ligar/desligar"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opções para ligar/desligar"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ecrã de bloqueio"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Definições rápidas"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificações"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de ecrã"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Fazer captura de ecrã"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Aumentar volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Diminuir volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar brilho"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Diminuir brilho"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir para o ecrã anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir para o ecrã seguinte"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"O menu Acessibilidade disponibiliza um menu grande no ecrã para controlar o dispositivo. Pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de ecrã e muito mais."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controle o dispositivo através do menu grande"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Definições do menu Acessibilidade"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botões grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar o tamanho dos botões do menu de acessibilidade"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ajuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brilho: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume da música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml new file mode 100644 index 000000000000..37f0980bbc55 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu de acessibilidade"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Google Assistente"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"Configurações de acessibilidade"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Controles de volume"</string> + <string name="power_label" msgid="7699720321491287839">"Liga/desliga"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opções do botão liga/desliga"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Tela de bloqueio"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Config. rápida"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificações"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captura de tela"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Fazer uma captura de tela"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Aumentar volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Diminuir volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Aumentar o brilho"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Diminuir o brilho"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Ir para tela anterior"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Ir para a próxima tela"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlar o dispositivo com o menu grande"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Config. do menu de acessibilidade"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botões grandes"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar o tamanho dos botões do menu de acessibilidade"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ajuda"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Brilho: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume da música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml new file mode 100644 index 000000000000..77b4318e8fa0 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meniul Accesibilitate"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meniul Accesibilitate este un meniu mare afișat pe ecran, cu ajutorul căruia îți controlezi dispozitivul. Poți să blochezi dispozitivul, să ajustezi volumul și luminozitatea, să faci capturi de ecran și multe altele."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Setări de accesibilitate"</string> + <string name="volume_label" msgid="3682221827627150574">"Volum"</string> + <string name="volume_utterance" msgid="408291570329066290">"Comenzi pentru volum"</string> + <string name="power_label" msgid="7699720321491287839">"Alimentare"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opțiuni pentru alimentare"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplicații recente"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ecran de blocare"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Setări rapide"</string> + <string name="notifications_label" msgid="6829741046963013567">"Notificări"</string> + <string name="screenshot_label" msgid="863978141223970162">"Captură de ecran"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Realizează o captură de ecran"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Mărește volumul"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Redu volumul"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Mărește luminozitatea"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Redu luminozitatea"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Accesează ecranul precedent"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Accesează ecranul următor"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Meniul Accesibilitate este un meniu mare afișat pe ecran, cu ajutorul căruia îți controlezi dispozitivul. Poți să blochezi dispozitivul, să ajustezi volumul și luminozitatea, să faci capturi de ecran și multe altele."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlează dispozitivul cu ajutorul unui meniu mare"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Setări pentru meniul Accesibilitate"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Butoane mari"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Mărește butoanele meniului de accesibilitate"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ajutor"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminozitate: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumul pentru muzică: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml new file mode 100644 index 000000000000..1e9ec497a697 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню спец. возможностей"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"С помощью большого экранного меню специальных возможностей можно блокировать устройство, регулировать громкость звука и яркость экрана, делать скриншоты и выполнять другие действия."</string> + <string name="assistant_label" msgid="6796392082252272356">"Ассистент"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Настройки специальных возможностей"</string> + <string name="volume_label" msgid="3682221827627150574">"Громкость"</string> + <string name="volume_utterance" msgid="408291570329066290">"Кнопки регулировки громкости"</string> + <string name="power_label" msgid="7699720321491287839">"Кнопка питания"</string> + <string name="power_utterance" msgid="7444296686402104807">"Настройки кнопки питания"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Недавние приложения"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Блокировка экрана"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Быстрые настройки"</string> + <string name="notifications_label" msgid="6829741046963013567">"Уведомления"</string> + <string name="screenshot_label" msgid="863978141223970162">"Скриншот"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Сделать скриншот"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Увеличить громкость"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Уменьшить громкость"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Увеличить яркость"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Уменьшить яркость"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Вернуться на предыдущий экран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Перейти на следующий экран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"С помощью большого экранного меню специальных возможностей можно блокировать устройство, регулировать громкость звука и яркость экрана, делать скриншоты и выполнять другие действия."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Управление устройством с помощью большого меню"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Настройки меню специальных возможностей"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Увеличить кнопки"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Увеличить размер кнопок в меню специальных возможностей"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Справка"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Яркость <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Громкость музыки <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml new file mode 100644 index 000000000000..ecd4c16c09d5 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ප්රවේශ්යතා මෙනුව"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"ප්රවේශ්යතා මෙනුව ඔබගේ උපාංගය පාලනය කිරීම සඳහා විශාල තිරය මත මෙනුවක් සපයයි. ඔබට ඔබගේ උපාංගය අගුලු හැරීමට, හඬ පරිමාව සහ දීප්තිය පාලනය කිරීමට, තිර රූ ගැනීමට සහ තවත් දේ කිරීමට හැකිය."</string> + <string name="assistant_label" msgid="6796392082252272356">"සහායක"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ප්රවේශ්යතා සැකසීම්"</string> + <string name="volume_label" msgid="3682221827627150574">"ශබ්දය"</string> + <string name="volume_utterance" msgid="408291570329066290">"හඬ පරිමා පාලන"</string> + <string name="power_label" msgid="7699720321491287839">"බලය"</string> + <string name="power_utterance" msgid="7444296686402104807">"බලය විකල්ප"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"මෑත යෙදුම්"</string> + <string name="lockscreen_label" msgid="648347953557887087">"අගුලු තිරය"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"ක්ෂණික සැකසීම්"</string> + <string name="notifications_label" msgid="6829741046963013567">"දැනුම්දීම්"</string> + <string name="screenshot_label" msgid="863978141223970162">"තිර රුව"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"තිර රුව ගන්න"</string> + <string name="volume_up_label" msgid="8592766918780362870">"හඬ පරිමාව වැඩි කිරීම"</string> + <string name="volume_down_label" msgid="8574981863656447346">"හඬ පරිමාව අඩු කිරීම"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"දීප්තිය වැඩි කිරීම"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"දීප්තිය අඩු කිරීම"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"පෙර තිරයට යන්න"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"මීළඟ තිරයට යන්න"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"ප්රවේශ්යතා මෙනුව ඔබගේ උපාංගය පාලනය කිරීම සඳහා විශාල තිරය මත මෙනුවක් සපයයි. ඔබට ඔබගේ උපාංගය අගුලු හැරීමට, හඬ පරිමාව සහ දීප්තිය පාලනය කිරීමට, තිර රූ ගැනීමට සහ තවත් දේ කිරීමට හැකිය."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"විශාල මෙනුව හරහා උපාංගය පාලනය කරන්න"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ප්රවේශ්යතා මෙනු සැකසීම්"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"විශාල බොත්තම්"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ප්රවේශ්යතා මෙනු බොත්තම්වල ප්රමාණය වැඩි කරන්න"</string> + <string name="pref_help_title" msgid="6871558837025010641">"උදවු"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"දීප්තිය <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"සංගීත හඬ පරිමාව <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml new file mode 100644 index 000000000000..a8c8a89f3fb8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Ponuka dostupnosti"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Ponuka dostupnosti spustí na obrazovke telefónu veľkú ponuku, pomocou ktorej môžete ovládať svoje zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavenia dostupnosti"</string> + <string name="volume_label" msgid="3682221827627150574">"Hlasitosť"</string> + <string name="volume_utterance" msgid="408291570329066290">"Ovládanie hlasitosti"</string> + <string name="power_label" msgid="7699720321491287839">"Vypínač"</string> + <string name="power_utterance" msgid="7444296686402104807">"Možnosti vypínača"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nedávne aplikácie"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Uzamknutá obrazovka"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Rýchle nastavenia"</string> + <string name="notifications_label" msgid="6829741046963013567">"Upozornenia"</string> + <string name="screenshot_label" msgid="863978141223970162">"Snímka obrazovky"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Vytvoriť snímku obrazovky"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Zvýšiť hlasitosť"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Znížiť hlasitosť"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Zvýšiť jas"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Znížiť jas"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Prejsť na predchádzajúcu obrazovku"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Prejsť na ďalšiu obrazovku"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Ponuka dostupnosti spustí na obrazovke telefónu veľkú ponuku, pomocou ktorej môžete ovládať svoje zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládajte zariadenie pomocou veľkej ponuky"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavenia ponuky Dostupnosť"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veľké tlačidlá"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zväčšiť tlačidlá ponuky Dostupnosť"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomocník"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Jas: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Hlasitosť hudby: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml new file mode 100644 index 000000000000..aaa576d0534e --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni s funkcijami za ljudi s posebnimi potrebami"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni s funkcijami za ljudi s posebnimi potrebami je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string> + <string name="assistant_label" msgid="6796392082252272356">"Pomočnik"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavitve funkcij za ljudi s posebnimi potrebami"</string> + <string name="volume_label" msgid="3682221827627150574">"Glasnost"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrolniki za glasnost"</string> + <string name="power_label" msgid="7699720321491287839">"Vklop"</string> + <string name="power_utterance" msgid="7444296686402104807">"Možnosti gumba za vklop"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Zaklepanje zaslona"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Hitre nastavitve"</string> + <string name="notifications_label" msgid="6829741046963013567">"Obvestila"</string> + <string name="screenshot_label" msgid="863978141223970162">"Posnetek zaslona"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ustvarjanje posnetka zaslona"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Povečanje glasnosti"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Zmanjšanje glasnosti"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Povečanje svetlosti"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Zmanjšanje svetlosti"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Na prejšnji zaslon"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Na naslednji zaslon"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni s funkcijami za ljudi s posebnimi potrebami je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljanje naprave prek velikega menija"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavitve menija s funkcijami za ljudi s posebnimi potrebami"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veliki gumbi"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povečanje velikosti gumbov menija s funkcijami za ljudi s posebnimi potrebami"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Pomoč"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Svetlost <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Glasnost glasbe <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml new file mode 100644 index 000000000000..2dfe2e7115f3 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menyja e qasshmërisë"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Menyja e qasshmërisë\" ofron një meny të madhe në ekran për të kontrolluar pajisjen tënde. Mund të kyçësh pajisjen, të kontrollosh volumin dhe ndriçimin, të nxjerrësh pamje ekrani dhe të tjera."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistenti"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Cilësimet e qasshmërisë"</string> + <string name="volume_label" msgid="3682221827627150574">"Volumi"</string> + <string name="volume_utterance" msgid="408291570329066290">"Kontrollet e volumit"</string> + <string name="power_label" msgid="7699720321491287839">"Energjia"</string> + <string name="power_utterance" msgid="7444296686402104807">"Opsionet e energjisë"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Aplikacionet e fundit"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ekrani i kyçjes"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Cilësimet e shpejta"</string> + <string name="notifications_label" msgid="6829741046963013567">"Njoftimet"</string> + <string name="screenshot_label" msgid="863978141223970162">"Pamja e ekranit"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Të nxjerrë një pamje të ekranit"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Rrit volumin"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Ul volumin"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Rrit ndriçimin"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Ul ndriçimin"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Shko tek ekrani i mëparshëm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Shko tek ekrani tjetër"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"\"Menyja e qasshmërisë\" ofron një meny të madhe në ekran për të kontrolluar pajisjen tënde. Mund të kyçësh pajisjen, të kontrollosh volumin dhe ndriçimin, të nxjerrësh pamje ekrani dhe të tjera."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrollo pajisjen nëpërmjet menysë së madhe"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Cilësimet e menysë së qasshmërisë"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Butona të mëdhenj"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Rrit madhësinë e butonave të \"Menysë së qasshmërisë\""</string> + <string name="pref_help_title" msgid="6871558837025010641">"Ndihma"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Ndriçimi <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumi i muzikës <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml new file mode 100644 index 000000000000..6538c43cad75 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Мени Приступачност"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Мени Приступачност пружа велики мени на екрану за контролу уређаја. Можете да закључате уређај, контролишете јачину звука и осветљеност, правите снимке екрана и друго."</string> + <string name="assistant_label" msgid="6796392082252272356">"Помоћник"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Подешавања приступачности"</string> + <string name="volume_label" msgid="3682221827627150574">"Јачина звука"</string> + <string name="volume_utterance" msgid="408291570329066290">"Контроле јачине звука"</string> + <string name="power_label" msgid="7699720321491287839">"Напајање"</string> + <string name="power_utterance" msgid="7444296686402104807">"Опције напајања"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Недавне апликације"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Закључан екран"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Брза подешавања"</string> + <string name="notifications_label" msgid="6829741046963013567">"Обавештења"</string> + <string name="screenshot_label" msgid="863978141223970162">"Снимак екрана"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Сними екран"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Појачај звук"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Утишај звук"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Повећајте осветљеност"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Смањите осветљеност"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Иди на претходни екран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Иди на следећи екран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Мени Приступачност пружа велики мени на екрану за контролу уређаја. Можете да закључате уређај, контролишете јачину звука и осветљеност, правите снимке екрана и друго."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Контролишите уређај помоћу великог менија"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Подешавања менија Приступачност"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Велика дугмад"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Повећајте величину дугмади у менију за приступачност"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Помоћ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Осветљеност: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Јачина звука музике: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml new file mode 100644 index 000000000000..2e7a49655133 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Tillgänglighetsmenyn"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Tillgänglighetsmenyn är en stor meny på skärmen som du kan styra enheten med. Du kan låsa enheten, ställa in volym och ljusstyrka, ta skärmbilder och annat."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Tillgänglighetsinställningar"</string> + <string name="volume_label" msgid="3682221827627150574">"Volym"</string> + <string name="volume_utterance" msgid="408291570329066290">"Volymkontroller"</string> + <string name="power_label" msgid="7699720321491287839">"Styrka"</string> + <string name="power_utterance" msgid="7444296686402104807">"Strömalternativ"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Senaste apparna"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Låsskärm"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Snabbinställningar"</string> + <string name="notifications_label" msgid="6829741046963013567">"Aviseringar"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skärmbild"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ta skärmbild"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Höj volymen"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Sänk volymen"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Öka ljusstyrkan"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Minska ljusstyrkan"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Tillbaka till föregående skärm"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Fortsätt till nästa skärm"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Tillgänglighetsmenyn är en stor meny på skärmen som du kan styra enheten med. Du kan låsa enheten, ställa in volym och ljusstyrka, ta skärmbilder och annat."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Styra enheten via en stor meny"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Inställningar för tillgänglighetsmenyn"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Stora knappar"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Öka knapparnas storlek i tillgänglighetsmenyn"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Hjälp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Ljusstyrka <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musikvolym <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml new file mode 100644 index 000000000000..c7a52aede4e8 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menyu ya Ufikivu"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menyu ya Ufikivu huonyesha menyu pana iliyo kwenye skrini ili udhibiti kifaa chako. Unaweza kufunga kifaa chako, kudhibiti sauti na ung\'avu, kupiga picha ya skrini na zaidi."</string> + <string name="assistant_label" msgid="6796392082252272356">"Mratibu"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Mipangilio ya Ufikivu"</string> + <string name="volume_label" msgid="3682221827627150574">"Sauti"</string> + <string name="volume_utterance" msgid="408291570329066290">"Vidhibiti vya sauti"</string> + <string name="power_label" msgid="7699720321491287839">"Nishati"</string> + <string name="power_utterance" msgid="7444296686402104807">"Chaguo za kuwasha"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Programu za hivi karibuni"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Skrini iliyofungwa"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Mipangilio ya Haraka"</string> + <string name="notifications_label" msgid="6829741046963013567">"Arifa"</string> + <string name="screenshot_label" msgid="863978141223970162">"Picha ya skrini"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Piga picha ya skrini"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Ongeza sauti"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Punguza sauti"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Ongeza ung\'aavu"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Punguza ung`aavu"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Nenda kwenye skrini iliyotangulia"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Nenda kwenye skrini inayofuata"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menyu ya Ufikivu huonyesha menyu pana iliyo kwenye skrini ili udhibiti kifaa chako. Unaweza kufunga kifaa chako, kudhibiti sauti na ung\'avu, kupiga picha ya skrini na zaidi."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Dhibiti kifaa ukitumia menyu pana"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Mipangilio ya Zana za Ufikivu"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Vitufe vikubwa"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Ongeza ukubwa wa Vitufe vya Menyu ya Ufikivu"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Usaidizi"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Ung\'avu <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Sauti ya muziki <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml new file mode 100644 index 000000000000..0172b5b3669d --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"அணுகல்தன்மை மெனு"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"அணுகல்தன்மை மெனுவானது உங்கள் சாதனத்தைக் கட்டுப்படுத்துவதற்கு, திரையில் தோன்றும் பெரிய மெனுவை வழங்குகிறது. சாதனத்தைப் பூட்டுதல், ஒலியளவையும் ஒளிர்வையும் மாற்றுதல், ஸ்கிரீன்ஷாட்களை எடுத்தல் போன்ற பலவற்றைச் செய்யலாம்."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"அணுகல்தன்மை அமைப்புகள்"</string> + <string name="volume_label" msgid="3682221827627150574">"ஒலியளவு"</string> + <string name="volume_utterance" msgid="408291570329066290">"ஒலியளவுக் கட்டுப்பாடுகள்"</string> + <string name="power_label" msgid="7699720321491287839">"பவர் பட்டன்"</string> + <string name="power_utterance" msgid="7444296686402104807">"பவர் பட்டன் விருப்பங்கள்"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"சமீபத்திய ஆப்ஸ்"</string> + <string name="lockscreen_label" msgid="648347953557887087">"லாக் ஸ்கிரீன்"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"விரைவு அமைப்புகள்"</string> + <string name="notifications_label" msgid="6829741046963013567">"அறிவிப்புகள்"</string> + <string name="screenshot_label" msgid="863978141223970162">"ஸ்கிரீன்ஷாட்"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ஸ்கிரீன் ஷாட்டை எடுக்கும் பட்டன்"</string> + <string name="volume_up_label" msgid="8592766918780362870">"ஒலியளவை அதிகரிப்பதற்கான பட்டன்"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ஒலியளவைக் குறைக்கும்"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ஒளிர்வை அதிகரிப்பதற்கான பட்டன்"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ஒளிர்வைக் குறைக்கும்"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"முந்தைய திரைக்குச் செல்வதற்கான பட்டன்"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"அடுத்த திரைக்குச் செல்வதற்கான பட்டன்"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"அணுகல்தன்மை மெனுவானது உங்கள் சாதனத்தைக் கட்டுப்படுத்துவதற்கு, திரையில் தோன்றும் பெரிய மெனுவை வழங்குகிறது. சாதனத்தைப் பூட்டுதல், ஒலியளவையும் ஒளிர்வையும் மாற்றுதல், ஸ்கிரீன்ஷாட்களை எடுத்தல் போன்ற பலவற்றைச் செய்யலாம்."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"பெரிய மெனுவின் மூலம் சாதனத்தைக் கட்டுப்படுத்தலாம்"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"அணுகல்தன்மை மெனு அமைப்புகள்"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"பெரிய பட்டன்கள்"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"’அணுகலம்சங்கள் மெனு பட்டன்களின்’ அளவைப் பெரிதாக்கும்"</string> + <string name="pref_help_title" msgid="6871558837025010641">"உதவி"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ஒளிர்வு: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"இசை ஒலியளவு: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml new file mode 100644 index 000000000000..54b10f1d8387 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"యాక్సెసిబిలిటీ మెనూ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"మీ పరికరాన్ని కంట్రోల్ చేయడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్ మరియు ప్రకాశాన్ని కంట్రోల్ చేయవచ్చు, స్క్రీన్షాట్లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"యాక్సెస్ సామర్థ్య సెట్టింగ్లు"</string> + <string name="volume_label" msgid="3682221827627150574">"వాల్యూమ్"</string> + <string name="volume_utterance" msgid="408291570329066290">"వాల్యూమ్ నియంత్రణలు"</string> + <string name="power_label" msgid="7699720321491287839">"పవర్"</string> + <string name="power_utterance" msgid="7444296686402104807">"పవర్ ఎంపికలు"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"ఇటీవలి యాప్లు"</string> + <string name="lockscreen_label" msgid="648347953557887087">"లాక్ స్క్రీన్"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"క్విక్ సెట్టింగ్లు"</string> + <string name="notifications_label" msgid="6829741046963013567">"నోటిఫికేషన్లు"</string> + <string name="screenshot_label" msgid="863978141223970162">"స్క్రీన్షాట్"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"స్క్రీన్షాట్ని తీయండి"</string> + <string name="volume_up_label" msgid="8592766918780362870">"వాల్యూమ్ పెంచు"</string> + <string name="volume_down_label" msgid="8574981863656447346">"వాల్యూమ్ తగ్గించు"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"ప్రకాశాన్ని పెంచుతుంది"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ప్రకాశాన్ని తగ్గిస్తుంది"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"మునుపటి స్క్రీన్కు వెళ్లండి"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"తదుపరి స్క్రీన్కు వెళ్లండి"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"మీ పరికరాన్ని నియంత్రించడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్ మరియు ప్రకాశాన్ని నియంత్రించవచ్చు, స్క్రీన్షాట్లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"పెద్ద మెనూ ద్వారా పరికరాన్ని నియంత్రించండి"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"యాక్సెసిబిలిటీ మెనూ సెట్టింగ్లు"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"పెద్ద బటన్లు"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"యాక్సెసిబిలిటీ మెనూ బటన్ల సైజ్ పెంచుతుంది"</string> + <string name="pref_help_title" msgid="6871558837025010641">"సహాయం"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ప్రకాశం <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"సంగీతం వాల్యూమ్ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml new file mode 100644 index 000000000000..5748b5cb9afa --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"เมนูการช่วยเหลือพิเศษ"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"เมนูการช่วยเหลือพิเศษเป็นเมนูขนาดใหญ่บนหน้าจอที่มีไว้ควบคุมอุปกรณ์ คุณจะล็อกอุปกรณ์ ควบคุมระดับเสียงและความสว่าง ถ่ายภาพหน้าจอ และอื่นๆ ได้"</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> + <string name="a11y_settings_label" msgid="3977714687248445050">"การตั้งค่าการช่วยเหลือพิเศษ"</string> + <string name="volume_label" msgid="3682221827627150574">"ระดับเสียง"</string> + <string name="volume_utterance" msgid="408291570329066290">"การควบคุมเสียง"</string> + <string name="power_label" msgid="7699720321491287839">"เปิด/ปิด"</string> + <string name="power_utterance" msgid="7444296686402104807">"ตัวเลือกสำหรับการเปิด/ปิด"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"แอปล่าสุด"</string> + <string name="lockscreen_label" msgid="648347953557887087">"หน้าจอล็อก"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"การตั้งค่าด่วน"</string> + <string name="notifications_label" msgid="6829741046963013567">"การแจ้งเตือน"</string> + <string name="screenshot_label" msgid="863978141223970162">"ภาพหน้าจอ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"จับภาพหน้าจอ"</string> + <string name="volume_up_label" msgid="8592766918780362870">"เพิ่มระดับเสียง"</string> + <string name="volume_down_label" msgid="8574981863656447346">"ลดระดับเสียง"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"เพิ่มความสว่าง"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"ลดความสว่าง"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ไปที่หน้าจอก่อนหน้า"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ไปที่หน้าจอถัดไป"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"เมนูการช่วยเหลือพิเศษเป็นเมนูขนาดใหญ่บนหน้าจอที่มีไว้ควบคุมอุปกรณ์ คุณจะล็อกอุปกรณ์ ควบคุมระดับเสียงและความสว่าง ถ่ายภาพหน้าจอ และอื่นๆ ได้"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ควบคุมอุปกรณ์ผ่านเมนูขนาดใหญ่"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"การตั้งค่าเมนูการช่วยเหลือพิเศษ"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ปุ่มใหญ่"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"เพิ่มขนาดของปุ่มเมนูการช่วยเหลือพิเศษ"</string> + <string name="pref_help_title" msgid="6871558837025010641">"ความช่วยเหลือ"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"ความสว่าง <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"ระดับเสียงเพลง <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml new file mode 100644 index 000000000000..ed1269baffd7 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu ng Accessibility"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Nagbibigay ang Menu ng Accessibility ng malaking menu sa screen para sa pagkontrol sa iyong device. Magagawa mong i-lock ang iyong device, kontrolin ang volume at liwanag, kumuha ng mga screenshot, at higit pa."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Mga Setting ng Accessibility"</string> + <string name="volume_label" msgid="3682221827627150574">"Volume"</string> + <string name="volume_utterance" msgid="408291570329066290">"Mga kontrol ng volume"</string> + <string name="power_label" msgid="7699720321491287839">"Power"</string> + <string name="power_utterance" msgid="7444296686402104807">"Mga opsyon sa power"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Mga kamakailang app"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Lock screen"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Mga Mabilisang Setting"</string> + <string name="notifications_label" msgid="6829741046963013567">"Mga Notification"</string> + <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Kumuha ng screenshot"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Lakasan ang volume"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Hinaan ang volume"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Taasan ang liwanag"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Babaan ang liwanag"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Pumunta sa nakaraang screen"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Pumunta sa susunod na screen"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Nagbibigay ang Menu ng Accessibility ng malaking menu sa screen para kontrolin ang iyong device. Magagawa mong i-lock ang iyong device, kontrolin ang volume at liwanag, kumuha ng mga screenshot, at higit pa."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontrolin ang device sa pamamagitan ng malaking menu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Mga Setting ng Menu ng Accessibility"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Malalaking button"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Palakihin ang Mga Button ng Menu ng Accessibility"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Tulong"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Liwanag <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume ng musika <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml new file mode 100644 index 000000000000..76a6ec7d8eb6 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Erişilebilirlik Menüsü"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Erişilebilirlik menüsü, cihazınızı kontrol etmeniz için geniş bir ekran menüsü sağlar. Cihazınızı kilitleyebilir, ses düzeyini ve parlaklığı kontrol edebilir, ekran görüntüsü alabilir ve daha fazlasını yapabilirsiniz."</string> + <string name="assistant_label" msgid="6796392082252272356">"Asistan"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Erişebilirlik Ayarları"</string> + <string name="volume_label" msgid="3682221827627150574">"Ses düzeyi"</string> + <string name="volume_utterance" msgid="408291570329066290">"Ses denetimleri"</string> + <string name="power_label" msgid="7699720321491287839">"Güç"</string> + <string name="power_utterance" msgid="7444296686402104807">"Güç seçenekleri"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Son uygulamalar"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Kilit ekranı"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Hızlı Ayarlar"</string> + <string name="notifications_label" msgid="6829741046963013567">"Bildirimler"</string> + <string name="screenshot_label" msgid="863978141223970162">"Ekran görüntüsü"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Ekran görüntüsü al"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Sesi aç"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Sesi kıs"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Parlaklığı artır"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Parlaklığı azalt"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Önceki ekrana git"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Sonraki ekrana git"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Erişilebilirlik menüsü, cihazınızı kontrol etmeniz için geniş bir ekran menüsü sağlar. Cihazınızı kilitleyebilir, ses düzeyini ve parlaklığı kontrol edebilir, ekran görüntüsü alabilir ve daha fazlasını yapabilirsiniz."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Cihazı geniş menüyle kontrol edin"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Erişilebilirlik Menüsü Ayarları"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Büyük düğmeler"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Erişilebilirlik Menüsündeki Düğmelerin boyutunu artır"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Yardım"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Parlaklık %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Müzik ses düzeyi %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml new file mode 100644 index 000000000000..970ba2183a12 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню спеціальних можливостей"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"За допомогою великого екранного меню спеціальних можливостей можна заблокувати пристрій, змінювати гучність і яскравість, робити знімки екрана та багато іншого."</string> + <string name="assistant_label" msgid="6796392082252272356">"Асистент"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Налаштування спеціальніх можливостей"</string> + <string name="volume_label" msgid="3682221827627150574">"Гучність"</string> + <string name="volume_utterance" msgid="408291570329066290">"Регулятори гучності"</string> + <string name="power_label" msgid="7699720321491287839">"Живлення"</string> + <string name="power_utterance" msgid="7444296686402104807">"Опції живлення"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Нещодавні додатки"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Заблокований екран"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Швидкі налаштування"</string> + <string name="notifications_label" msgid="6829741046963013567">"Сповіщення"</string> + <string name="screenshot_label" msgid="863978141223970162">"Знімок екрана"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Зробити знімок екрана"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Збільшити гучність"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Зменшити гучність"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Збільшити яскравість"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Зменшити яскравість"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Перейти на попередній екран"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Перейти на наступний екран"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"За допомогою великого екранного меню спеціальних можливостей можна заблокувати пристрій, змінювати гучність і яскравість, робити знімки екрана та багато іншого."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Керування пристроєм за допомогою великого меню"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Налаштування \"Меню спеціальних можливостей\""</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Великі кнопки"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Збільшити розмір кнопок меню спеціальних можливостей"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Довідка"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Яскравість: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Гучність музики: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml new file mode 100644 index 000000000000..b1f2f3b67de2 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"ایکسیسبیلٹی مینو"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینو ایک بڑا آن اسکرین مینو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string> + <string name="assistant_label" msgid="6796392082252272356">"اسسٹنٹ"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"ایکسیسبیلٹی ترتیبات"</string> + <string name="volume_label" msgid="3682221827627150574">"والیوم"</string> + <string name="volume_utterance" msgid="408291570329066290">"والیوم کے کنٹرولز"</string> + <string name="power_label" msgid="7699720321491287839">"پاور"</string> + <string name="power_utterance" msgid="7444296686402104807">"پاور کے اختیارات"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"حالیہ ایپس"</string> + <string name="lockscreen_label" msgid="648347953557887087">"مقفل اسکرین"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"فوری ترتیبات"</string> + <string name="notifications_label" msgid="6829741046963013567">"اطلاعات"</string> + <string name="screenshot_label" msgid="863978141223970162">"اسکرین شاٹ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"اسکرین شاٹ لیں"</string> + <string name="volume_up_label" msgid="8592766918780362870">"والیوم بڑھانے کا بٹن"</string> + <string name="volume_down_label" msgid="8574981863656447346">"والیوم کم کرنے کا بٹن"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"چمک بڑھانے کا بٹن"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"چمک کم کرنے کا بٹن"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"پچھلی اسکرین پر جائیں"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"اگلی اسکرین پر جائیں"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینو ایک بڑا آن اسکرین مینو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"بڑے مینو کے ذریعے آلہ کنٹرول کریں"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ایکسیسبیلٹی مینو کی ترتیبات"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"بڑے بٹنز"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ایکسیسبیلٹی مینو بٹنز کا سائز بڑھائیں"</string> + <string name="pref_help_title" msgid="6871558837025010641">"مدد"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"چمک %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"موسیقی کا والیوم %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml new file mode 100644 index 000000000000..63af1b136a5c --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Maxsus imkoniyatlar menyusi"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Maxsus imkoniyatlar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string> + <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Maxsus imkoniyatlar sozlamalari"</string> + <string name="volume_label" msgid="3682221827627150574">"Tovush balandligi"</string> + <string name="volume_utterance" msgid="408291570329066290">"Tovush balandligi tugmalari"</string> + <string name="power_label" msgid="7699720321491287839">"Quvvat"</string> + <string name="power_utterance" msgid="7444296686402104807">"Quvvat parametrlari"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Yaqinda ishlatilgan ilovalar"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Ekran qulfi"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Tezkor sozlamalar"</string> + <string name="notifications_label" msgid="6829741046963013567">"Bildirishnomalar"</string> + <string name="screenshot_label" msgid="863978141223970162">"Skrinshot"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Skrinshot olish"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Tovushni balandlatish"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Tovushni pasaytirish"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Yorqinlikni oshirish"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Yorqinlikni pasaytirish"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Avvalgi ekranni ochish"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Keyingi ekranni ochish"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Maxsus imkoniyatlar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Katta menyu orqali qurilmani boshqarish"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Maxsus imkoniyatlar menyusi sozlamalari"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Katta tugmalar"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Maxsus imkoniyatlar menyusi tugmalarini kattalashtirish"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Yordam"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Yorqinlik: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiqa tovushi balandligi: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml new file mode 100644 index 000000000000..e22a9ab2d91c --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Trình đơn hỗ trợ tiếp cận"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và nhiều chức năng khác."</string> + <string name="assistant_label" msgid="6796392082252272356">"Trợ lý"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Cài đặt hỗ trợ tiếp cận"</string> + <string name="volume_label" msgid="3682221827627150574">"Âm lượng"</string> + <string name="volume_utterance" msgid="408291570329066290">"Điều khiển âm lượng"</string> + <string name="power_label" msgid="7699720321491287839">"Nguồn"</string> + <string name="power_utterance" msgid="7444296686402104807">"Tùy chọn nút Nguồn"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Ứng dụng gần đây"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Màn hình khóa"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Cài đặt nhanh"</string> + <string name="notifications_label" msgid="6829741046963013567">"Thông báo"</string> + <string name="screenshot_label" msgid="863978141223970162">"Ảnh chụp màn hình"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Chụp ảnh màn hình"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Tăng âm lượng"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Giảm âm lượng"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Tăng độ sáng"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Giảm độ sáng"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Chuyển đến màn hình trước"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Chuyển đến màn hình tiếp theo"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và nhiều việc khác."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Điều khiển thiết bị qua trình đơn lớn"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Cài đặt Trình đơn Hỗ trợ tiếp cận"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Nút lớn"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Tăng kích thước của các nút trong Trình đơn Hỗ trợ tiếp cận"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Trợ giúp"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Độ sáng <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Âm lượng nhạc <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000000..e34f8d537a06 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"无障碍功能菜单"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"无障碍功能菜单可在屏幕上提供一个大号的菜单,供您控制设备,比如锁定设备、控制音量和亮度、截取屏幕快照等。"</string> + <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"无障碍设置"</string> + <string name="volume_label" msgid="3682221827627150574">"音量"</string> + <string name="volume_utterance" msgid="408291570329066290">"音量控件"</string> + <string name="power_label" msgid="7699720321491287839">"电源"</string> + <string name="power_utterance" msgid="7444296686402104807">"电源选项"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"最近用过的应用"</string> + <string name="lockscreen_label" msgid="648347953557887087">"锁定屏幕"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"快捷设置"</string> + <string name="notifications_label" msgid="6829741046963013567">"通知"</string> + <string name="screenshot_label" msgid="863978141223970162">"屏幕截图"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"抓取屏幕截图"</string> + <string name="volume_up_label" msgid="8592766918780362870">"调高音量"</string> + <string name="volume_down_label" msgid="8574981863656447346">"调低音量"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"调高亮度"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"调低亮度"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"转到上一个屏幕"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"转到下一个屏幕"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"无障碍功能菜单可在屏幕上提供一个大号的菜单,供您控制设备,比如锁定设备、控制音量和亮度、截取屏幕快照等。"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"使用大菜单控制设备"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"无障碍功能菜单设置"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大按钮"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"增大无障碍功能菜单按钮的大小"</string> + <string name="pref_help_title" msgid="6871558837025010641">"帮助"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"亮度:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"音乐音量:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000000..e08e52f36fa6 --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"無障礙功能選單"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string> + <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"無障礙功能設定"</string> + <string name="volume_label" msgid="3682221827627150574">"音量"</string> + <string name="volume_utterance" msgid="408291570329066290">"音量控制項"</string> + <string name="power_label" msgid="7699720321491287839">"電源"</string> + <string name="power_utterance" msgid="7444296686402104807">"電源選項"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"最近使用的應用程式"</string> + <string name="lockscreen_label" msgid="648347953557887087">"螢幕鎖定"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"快速設定"</string> + <string name="notifications_label" msgid="6829741046963013567">"通知"</string> + <string name="screenshot_label" msgid="863978141223970162">"螢幕擷取畫面"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"擷取螢幕擷圖"</string> + <string name="volume_up_label" msgid="8592766918780362870">"調高音量"</string> + <string name="volume_down_label" msgid="8574981863656447346">"調低音量"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"調光亮度"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"調暗亮度"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"前往上一個畫面"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"前往下一個畫面"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"透過大型選單控制裝置"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"無障礙功能選單設定"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大按鈕"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"放大「無障礙功能選單按鈕」"</string> + <string name="pref_help_title" msgid="6871558837025010641">"說明"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"光暗度:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"音樂音量:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000000..a6dfe71cfada --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"無障礙選單"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"無障礙工具選單是螢幕上的大型選單,可用來操控裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕畫面,以及執行其他功能。"</string> + <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"無障礙設定"</string> + <string name="volume_label" msgid="3682221827627150574">"音量"</string> + <string name="volume_utterance" msgid="408291570329066290">"音量控制項"</string> + <string name="power_label" msgid="7699720321491287839">"電源"</string> + <string name="power_utterance" msgid="7444296686402104807">"電源選項"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"最近使用的應用程式"</string> + <string name="lockscreen_label" msgid="648347953557887087">"螢幕鎖定"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"快速設定"</string> + <string name="notifications_label" msgid="6829741046963013567">"通知"</string> + <string name="screenshot_label" msgid="863978141223970162">"螢幕截圖"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"擷取螢幕畫面"</string> + <string name="volume_up_label" msgid="8592766918780362870">"調高音量"</string> + <string name="volume_down_label" msgid="8574981863656447346">"調低音量"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"調高亮度"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"調低亮度"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"返回上一個畫面"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"前往下一個畫面"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"無障礙工具選單是螢幕上的大型選單,可用來操控裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕畫面,以及執行其他功能。"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"透過大型選單操控裝置"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"無障礙選單設定"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大型按鈕"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"放大無障礙選單按鈕"</string> + <string name="pref_help_title" msgid="6871558837025010641">"說明"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"亮度 <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"音樂音量 <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml new file mode 100644 index 000000000000..bf7095703edb --- /dev/null +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Imenyu yokufinyeleleka"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"Imenyu yokufinyelela inikezela ngemenyu enkulu esesikrinini ukuze ulawule idivayisi yakho. Ungakhiya idivayisi yakho, ulawule ivolumu nokukhanya, uthathe izithombe-skrini, nokuningi."</string> + <string name="assistant_label" msgid="6796392082252272356">"Umsizi"</string> + <!-- no translation found for assistant_utterance (65509599221141377) --> + <skip /> + <string name="a11y_settings_label" msgid="3977714687248445050">"Izilungiselelo zokufinyelela"</string> + <string name="volume_label" msgid="3682221827627150574">"Ivolumu"</string> + <string name="volume_utterance" msgid="408291570329066290">"Izilawuli zevolumu"</string> + <string name="power_label" msgid="7699720321491287839">"Amandla"</string> + <string name="power_utterance" msgid="7444296686402104807">"Izinketho zamandla"</string> + <string name="recent_apps_label" msgid="6583276995616385847">"Izinhlelo zokusebenza zakamuva"</string> + <string name="lockscreen_label" msgid="648347953557887087">"Khiya isikrini"</string> + <string name="quick_settings_label" msgid="2999117381487601865">"Izilungiselelo ezisheshayo"</string> + <string name="notifications_label" msgid="6829741046963013567">"Izaziso"</string> + <string name="screenshot_label" msgid="863978141223970162">"Isithombe-skrini"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"Thatha isithombe-skrini"</string> + <string name="volume_up_label" msgid="8592766918780362870">"Ivolumu phezulu"</string> + <string name="volume_down_label" msgid="8574981863656447346">"Ivolumu iphansi"</string> + <string name="brightness_up_label" msgid="8010753822854544846">"Ukukhanya kuphezulu"</string> + <string name="brightness_down_label" msgid="7115662941913272072">"Ukukhanya kuphansi"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"Hamba kusikrini sangaphambilini"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"Iya kusikrini esilandelayo"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"Imenyu yokufinyelela inikezela ngemenyu enkulu esesikrinini ukuze ulawule idivayisi yakho. Ungakhiya idivayisi yakho, ulawule ivolumu nokukhanya, uthathe izithombe-skrini, nokuningi."</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Lawula idivayisi ngemenyu enkulu"</string> + <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Izilungiselelo zemenyu yokufinyelela"</string> + <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Izinkinobho ezinkulu"</string> + <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Khulisa usayizi wezinkinobho zemenyu yokufinyelela"</string> + <string name="pref_help_title" msgid="6871558837025010641">"Usizo"</string> + <string name="brightness_percentage_label" msgid="7391554573977867369">"Ukukhanya <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> + <string name="music_volume_percentage_label" msgid="398635599662604706">"Ivolumu yomculo <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string> +</resources> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values/strings.xml index 81fa8e6bba21..46bd611171a2 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values/strings.xml @@ -13,10 +13,6 @@ <string name="assistant_utterance">Assistant</string> <!-- String defining the label for the accessibility settings button --> <string name="a11y_settings_label">Accessibility Settings</string> - <!-- String defining the label for the volume button --> - <string name="volume_label">Volume</string> - <!-- String defining utterance for the volume button for screen readers --> - <string name="volume_utterance">Volume controls</string> <!-- String defining the label for the power button --> <string name="power_label">Power</string> <!-- String defining utterance for the power button for screen readers --> diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java index 26eefa9a2e89..5212e8ef1187 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java @@ -17,15 +17,18 @@ package com.android.systemui.monet.dynamiccolor; import com.android.systemui.monet.dislike.DislikeAnalyzer; -import com.android.systemui.monet.dynamiccolor.DynamicColor; -import com.android.systemui.monet.dynamiccolor.ToneDeltaConstraint; -import com.android.systemui.monet.dynamiccolor.TonePolarity; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.hct.ViewingConditions; import com.android.systemui.monet.scheme.DynamicScheme; import com.android.systemui.monet.scheme.Variant; /** Named colors, otherwise known as tokens, or roles, in the Material Design system. */ +// Prevent lint for Function.apply not being available on Android before API level 14 (4.0.1). +// "AndroidJdkLibsChecker" for Function, "NewApi" for Function.apply(). +// A java_library Bazel rule with an Android constraint cannot skip these warnings without this +// annotation; another solution would be to create an android_library rule and supply +// AndroidManifest with an SDK set higher than 14. +@SuppressWarnings({"AndroidJdkLibsChecker", "NewApi"}) public final class MaterialDynamicColors { private static final double CONTAINER_ACCENT_TONE_DELTA = 15.0; @@ -33,7 +36,6 @@ public final class MaterialDynamicColors { private MaterialDynamicColors() { } - /** In light mode, the darkest surface. In dark mode, the lightest surface. */ public static DynamicColor highestSurface(DynamicScheme s) { return s.isDark ? surfaceBright : surfaceDim; } @@ -49,7 +51,7 @@ public final class MaterialDynamicColors { DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); public static final DynamicColor surfaceInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 20.0); + DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 30.0); public static final DynamicColor surfaceBright = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0); @@ -57,19 +59,19 @@ public final class MaterialDynamicColors { public static final DynamicColor surfaceDim = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0); - public static final DynamicColor surfaceContainerLowest = + public static final DynamicColor surfaceSub2 = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0); - public static final DynamicColor surfaceContainerLow = + public static final DynamicColor surfaceSub1 = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0); public static final DynamicColor surfaceContainer = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0); - public static final DynamicColor surfaceContainerHigh = + public static final DynamicColor surfaceAdd1 = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0); - public static final DynamicColor surfaceContainerHighest = + public static final DynamicColor surfaceAdd2 = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0); public static final DynamicColor onSurface = @@ -95,7 +97,8 @@ public final class MaterialDynamicColors { public static final DynamicColor outlineVariant = DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> 80.0, (s) -> highestSurface(s)); + (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, + (s) -> highestSurface(s)); public static final DynamicColor primaryContainer = DynamicColor.fromPalette( @@ -115,7 +118,7 @@ public final class MaterialDynamicColors { if (!isFidelity(s)) { return s.isDark ? 90.0 : 10.0; } - return DynamicColor.contrastingTone(primaryContainer.getTone(s), 4.5); + return DynamicColor.contrastingTone(primaryContainer.tone.apply(s), 4.5); }, (s) -> primaryContainer, null); @@ -165,7 +168,7 @@ public final class MaterialDynamicColors { if (!isFidelity(s)) { return s.isDark ? 90.0 : 10.0; } - return DynamicColor.contrastingTone(secondaryContainer.getTone(s), 4.5); + return DynamicColor.contrastingTone(secondaryContainer.tone.apply(s), 4.5); }, (s) -> secondaryContainer); @@ -206,7 +209,7 @@ public final class MaterialDynamicColors { if (!isFidelity(s)) { return s.isDark ? 90.0 : 10.0; } - return DynamicColor.contrastingTone(tertiaryContainer.getTone(s), 4.5); + return DynamicColor.contrastingTone(tertiaryContainer.tone.apply(s), 4.5); }, (s) -> tertiaryContainer); @@ -252,49 +255,49 @@ public final class MaterialDynamicColors { DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 90.0, (s) -> highestSurface(s)); - public static final DynamicColor primaryFixedDim = + public static final DynamicColor primaryFixedDarker = DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 80.0, (s) -> highestSurface(s)); public static final DynamicColor onPrimaryFixed = DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 10.0, - (s) -> primaryFixedDim); + (s) -> primaryFixedDarker); public static final DynamicColor onPrimaryFixedVariant = DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 30.0, - (s) -> primaryFixedDim); + (s) -> primaryFixedDarker); public static final DynamicColor secondaryFixed = DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 90.0, (s) -> highestSurface(s)); - public static final DynamicColor secondaryFixedDim = + public static final DynamicColor secondaryFixedDarker = DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 80.0, (s) -> highestSurface(s)); public static final DynamicColor onSecondaryFixed = DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 10.0, - (s) -> secondaryFixedDim); + (s) -> secondaryFixedDarker); public static final DynamicColor onSecondaryFixedVariant = DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 30.0, - (s) -> secondaryFixedDim); + (s) -> secondaryFixedDarker); public static final DynamicColor tertiaryFixed = DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 90.0, (s) -> highestSurface(s)); - public static final DynamicColor tertiaryFixedDim = + public static final DynamicColor tertiaryFixedDarker = DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 80.0, (s) -> highestSurface(s)); public static final DynamicColor onTertiaryFixed = DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 10.0, - (s) -> tertiaryFixedDim); + (s) -> tertiaryFixedDarker); public static final DynamicColor onTertiaryFixedVariant = DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 30.0, - (s) -> tertiaryFixedDim); + (s) -> tertiaryFixedDarker); /** * These colors were present in Android framework before Android U, and used by MDC controls. @@ -366,27 +369,6 @@ public final class MaterialDynamicColors { public static final DynamicColor textHintInverse = DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); - public static final DynamicColor primaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); - - public static final DynamicColor secondaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); - - public static final DynamicColor tertiaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralVariantPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, - (s) -> s.neutralVariantPalette.getKeyColor().getTone()); - private static ViewingConditions viewingConditionsForAlbers(DynamicScheme scheme) { return ViewingConditions.defaultWithBackgroundLstar(scheme.isDark ? 30.0 : 80.0); } @@ -433,4 +415,35 @@ public final class MaterialDynamicColors { return DynamicColor.enableLightForeground(albersd.getTone()); } } + + // Compatibility mappings for Android + public static final DynamicColor surfaceContainerLow = surfaceSub1; + public static final DynamicColor surfaceContainerLowest = surfaceSub2; + public static final DynamicColor surfaceContainerHigh = surfaceAdd1; + public static final DynamicColor surfaceContainerHighest = surfaceAdd2; + public static final DynamicColor primaryFixedDim = primaryFixedDarker; + public static final DynamicColor secondaryFixedDim = secondaryFixedDarker; + public static final DynamicColor tertiaryFixedDim = tertiaryFixedDarker; + + // Compatibility Keys Colors for Android + public static final DynamicColor primaryPaletteKeyColor = + DynamicColor.fromPalette( + (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); + + public static final DynamicColor secondaryPaletteKeyColor = + DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); + + public static final DynamicColor tertiaryPaletteKeyColor = + DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); + + public static final DynamicColor neutralPaletteKeyColor = + DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); + + public static final DynamicColor neutralVariantPaletteKeyColor = + DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, + (s) -> s.neutralVariantPalette.getKeyColor().getTone()); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt index babe5700a01c..5b6a83c24e3d 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt @@ -154,6 +154,10 @@ interface ClockFaceEvents { val tickRate: ClockTickRate get() = ClockTickRate.PER_MINUTE + /** Call to check whether the clock consumes weather data */ + val hasCustomWeatherDataDisplay: Boolean + get() = false + /** Region Darkness specific to the clock face */ fun onRegionDarknessChanged(isDark: Boolean) {} diff --git a/packages/SystemUI/res-product/values-en-rCA/strings.xml b/packages/SystemUI/res-product/values-en-rCA/strings.xml index df6533694fa9..fb7aa72178de 100644 --- a/packages/SystemUI/res-product/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-product/values-en-rCA/strings.xml @@ -40,9 +40,9 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet."</string> - <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device."</string> - <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone."</string> + <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the tablet."</string> + <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the device."</string> + <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the phone."</string> <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> diff --git a/packages/SystemUI/res/drawable/control_spinner_background.xml b/packages/SystemUI/res/drawable/control_spinner_background.xml index 46a9dad29fec..8416f9db9392 100644 --- a/packages/SystemUI/res/drawable/control_spinner_background.xml +++ b/packages/SystemUI/res/drawable/control_spinner_background.xml @@ -23,7 +23,7 @@ <item android:drawable="@drawable/ic_ksh_key_down" android:gravity="end|bottom" - android:paddingBottom="6dp" + android:bottom="4dp" android:width="24dp" android:height="24dp" android:end="12dp" /> diff --git a/packages/SystemUI/res/drawable/controls_popup_bg.xml b/packages/SystemUI/res/drawable/controls_popup_bg.xml new file mode 100644 index 000000000000..34dd6e5f70d9 --- /dev/null +++ b/packages/SystemUI/res/drawable/controls_popup_bg.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/transparent" /> + <corners android:radius="@dimen/control_popup_corner_radius" /> +</shape> diff --git a/packages/SystemUI/res/drawable/controls_popup_item_background.xml b/packages/SystemUI/res/drawable/controls_popup_item_background.xml new file mode 100644 index 000000000000..799218007b39 --- /dev/null +++ b/packages/SystemUI/res/drawable/controls_popup_item_background.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true"> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/control_popup_item_corner_radius" /> + <solid android:color="#303030" /> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/control_popup_item_corner_radius" /> + <solid android:color="#1f1f1f" /> + </shape> + </item> +</selector> diff --git a/packages/SystemUI/res/drawable/ic_open_in_new_window.xml b/packages/SystemUI/res/drawable/ic_open_in_new_window.xml index f41f78431788..ef450afb18de 100644 --- a/packages/SystemUI/res/drawable/ic_open_in_new_window.xml +++ b/packages/SystemUI/res/drawable/ic_open_in_new_window.xml @@ -17,29 +17,26 @@ <item> <shape android:shape="rectangle"> - <solid android:color="@color/magnification_switch_button_color" /> + <stroke + android:color="@android:color/black" + android:width="@dimen/magnifier_stroke_width"/> + <corners android:radius="@dimen/magnification_setting_drag_corner_radius" /> + <solid android:color="@color/magnification_border_color" /> <size - android:width="48dp" - android:height="48dp" /> + android:width="@dimen/magnification_setting_drag_size" + android:height="@dimen/magnification_setting_drag_size" /> </shape> </item> - <item - android:gravity="center"> - <vector - android:width="36dp" - android:height="36dp" - android:viewportWidth="24" - android:viewportHeight="24"> + <item android:gravity="center"> + <vector android:autoMirrored="true" + android:width="36dp" + android:height="36dp" + android:viewportWidth="48" + android:viewportHeight="48"> <path - android:pathData="M2,12.05V22.05H22V2.05H12V4.05H20V20.05H4V12.05H2Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M10,2.05H2V10.05H10V2.05Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M18,11.05V13.05H14.41L18.95,17.59L17.54,19L13,14.46V18.05H11V11.05H18Z" - android:fillColor="#ffffff"/> + android:pathData="m19.4,44 l-1,-6.3q-0.95,-0.35 -2,-0.95t-1.85,-1.25l-5.9,2.7L4,30l5.4,-3.95q-0.1,-0.45 -0.125,-1.025Q9.25,24.45 9.25,24q0,-0.45 0.025,-1.025T9.4,21.95L4,18l4.65,-8.2 5.9,2.7q0.8,-0.65 1.85,-1.25t2,-0.9l1,-6.35h9.2l1,6.3q0.95,0.35 2.025,0.925Q32.7,11.8 33.45,12.5l5.9,-2.7L44,18l-5.4,3.85q0.1,0.5 0.125,1.075 0.025,0.575 0.025,1.075t-0.025,1.05q-0.025,0.55 -0.125,1.05L44,30l-4.65,8.2 -5.9,-2.7q-0.8,0.65 -1.825,1.275 -1.025,0.625 -2.025,0.925l-1,6.3ZM21.8,41h4.4l0.7,-5.6q1.65,-0.4 3.125,-1.25T32.7,32.1l5.3,2.3 2,-3.6 -4.7,-3.45q0.2,-0.85 0.325,-1.675 0.125,-0.825 0.125,-1.675 0,-0.85 -0.1,-1.675 -0.1,-0.825 -0.35,-1.675L40,17.2l-2,-3.6 -5.3,2.3q-1.15,-1.3 -2.6,-2.175 -1.45,-0.875 -3.2,-1.125L26.2,7h-4.4l-0.7,5.6q-1.7,0.35 -3.175,1.2 -1.475,0.85 -2.625,2.1L10,13.6l-2,3.6 4.7,3.45q-0.2,0.85 -0.325,1.675 -0.125,0.825 -0.125,1.675 0,0.85 0.125,1.675 0.125,0.825 0.325,1.675L8,30.8l2,3.6 5.3,-2.3q1.2,1.2 2.675,2.05Q19.45,35 21.1,35.4ZM24,30.5q2.7,0 4.6,-1.9 1.9,-1.9 1.9,-4.6 0,-2.7 -1.9,-4.6 -1.9,-1.9 -4.6,-1.9 -2.7,0 -4.6,1.9 -1.9,1.9 -1.9,4.6 0,2.7 1.9,4.6 1.9,1.9 4.6,1.9ZM24,24Z" + android:fillColor="#000000"/> </vector> </item> diff --git a/packages/SystemUI/res/drawable/ic_sysbar_back.xml b/packages/SystemUI/res/drawable/ic_sysbar_back.xml index ee402622d52b..6c34655733ed 100644 --- a/packages/SystemUI/res/drawable/ic_sysbar_back.xml +++ b/packages/SystemUI/res/drawable/ic_sysbar_back.xml @@ -15,13 +15,13 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" + android:width="20dp" + android:height="20dp" android:autoMirrored="true" - android:viewportWidth="28" - android:viewportHeight="28"> + android:viewportWidth="20" + android:viewportHeight="20"> <path android:fillColor="?attr/singleToneColor" - android:pathData="M6.49,14.86c-0.66-0.39-0.66-1.34,0-1.73l6.02-3.53l5.89-3.46C19.11,5.73,20,6.26,20,7.1V14v6.9 c0,0.84-0.89,1.37-1.6,0.95l-5.89-3.46L6.49,14.86z" /> + android:pathData="M15.5417 1.66669C15.1833 1.66669 14.8417 1.76669 14.5333 1.94169L3.21667 8.74169C2.775 9.00002 2.5 9.48335 2.5 10C2.5 10.5167 2.775 11 3.21667 11.2584L14.5333 18.05C14.8417 18.2334 15.1833 18.325 15.5417 18.325C16.625 18.325 17.5 17.45 17.5 16.3667V3.62502C17.5 2.54169 16.625 1.66669 15.5417 1.66669Z" /> </vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_sysbar_home.xml b/packages/SystemUI/res/drawable/ic_sysbar_home.xml index da239372791f..8b2a58a50224 100644 --- a/packages/SystemUI/res/drawable/ic_sysbar_home.xml +++ b/packages/SystemUI/res/drawable/ic_sysbar_home.xml @@ -15,12 +15,12 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="28" - android:viewportHeight="28"> + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> <path android:fillColor="?attr/singleToneColor" - android:pathData="M 14 7 C 17.8659932488 7 21 10.1340067512 21 14 C 21 17.8659932488 17.8659932488 21 14 21 C 10.1340067512 21 7 17.8659932488 7 14 C 7 10.1340067512 10.1340067512 7 14 7 Z" /> + android:pathData="M10.0001 18.3334C5.40008 18.3334 1.66675 14.6 1.66675 10C1.66675 5.40002 5.40008 1.66669 10.0001 1.66669C14.6001 1.66669 18.3334 5.40002 18.3334 10C18.3334 14.6 14.6001 18.3334 10.0001 18.3334Z" /> </vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_sysbar_recent.xml b/packages/SystemUI/res/drawable/ic_sysbar_recent.xml index 6b038d179568..6ff3ec3f47f2 100644 --- a/packages/SystemUI/res/drawable/ic_sysbar_recent.xml +++ b/packages/SystemUI/res/drawable/ic_sysbar_recent.xml @@ -15,12 +15,12 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="28" - android:viewportHeight="28"> + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> <path android:fillColor="?attr/singleToneColor" - android:pathData="M19.9,21.5H8.1c-0.88,0-1.6-0.72-1.6-1.6V8.1c0-0.88,0.72-1.6,1.6-1.6h11.8c0.88,0,1.6,0.72,1.6,1.6v11.8 C21.5,20.78,20.78,21.5,19.9,21.5z" /> + android:pathData="M4.47634 2.5H15.5241C16.6164 2.5 17.5002 3.38382 17.5002 4.4761V15.5239C17.5002 16.6162 16.6164 17.5 15.5241 17.5H4.47634C3.38407 17.5 2.50024 16.6162 2.50024 15.5239V4.4761C2.50024 3.38382 3.38407 2.5 4.47634 2.5Z" /> </vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/controls_spinner_item.xml b/packages/SystemUI/res/layout/controls_spinner_item.xml index 574aed62ea86..4048d0371aa8 100644 --- a/packages/SystemUI/res/layout/controls_spinner_item.xml +++ b/packages/SystemUI/res/layout/controls_spinner_item.xml @@ -13,33 +13,28 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingVertical="@dimen/control_spinner_padding_vertical" - android:paddingHorizontal="@dimen/control_spinner_padding_horizontal"> + android:layout_height="@dimen/control_popup_item_height" + android:background="@drawable/controls_popup_item_background" + android:gravity="center_vertical|start" + android:orientation="horizontal" + android:paddingStart="@dimen/control_popup_item_padding" + android:paddingEnd="@dimen/control_popup_item_padding"> - <LinearLayout - android:orientation="horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center"> - - <ImageView - android:id="@+id/app_icon" - android:layout_gravity="center" - android:layout_width="@dimen/controls_header_app_icon_size" - android:layout_height="@dimen/controls_header_app_icon_size" - android:contentDescription="@null" - android:layout_marginEnd="10dp" /> - - <TextView - style="@style/Control.Spinner.Item" - android:id="@+id/controls_spinner_item" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" /> - </LinearLayout> + <ImageView + android:id="@+id/app_icon" + android:layout_width="@dimen/controls_header_app_icon_size" + android:layout_height="@dimen/controls_header_app_icon_size" + android:layout_marginEnd="@dimen/control_popup_item_padding" + android:contentDescription="@null" + tools:src="@drawable/ic_android" /> + <TextView + android:id="@+id/controls_spinner_item" + style="@style/Control.Spinner.Item" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + tools:text="Android" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml index 71561c07ebd3..b1259e48f7f7 100644 --- a/packages/SystemUI/res/layout/controls_with_favorites.xml +++ b/packages/SystemUI/res/layout/controls_with_favorites.xml @@ -50,11 +50,9 @@ <LinearLayout android:id="@+id/controls_header" android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:minHeight="48dp" android:orientation="horizontal"> <TextView @@ -64,7 +62,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="false" - tools:text="Test app" /> + tools:text="@tools:sample/lorem" /> </LinearLayout> <ImageView diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml index efcb6f3435b9..8bff1a135336 100644 --- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml +++ b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml @@ -29,9 +29,10 @@ android:format12Hour="@string/dream_time_complication_12_hr_time_format" android:format24Hour="@string/dream_time_complication_24_hr_time_format" android:fontFeatureSettings="pnum, lnum" + android:includeFontPadding="false" android:letterSpacing="0.02" + android:maxLines="1" android:textSize="@dimen/dream_overlay_complication_clock_time_text_size" - android:translationY="@dimen/dream_overlay_complication_clock_time_translation_y" app:keyShadowBlur="@dimen/dream_overlay_clock_key_text_shadow_radius" app:keyShadowOffsetX="@dimen/dream_overlay_clock_key_text_shadow_dx" app:keyShadowOffsetY="@dimen/dream_overlay_clock_key_text_shadow_dy" @@ -40,6 +41,7 @@ app:ambientShadowOffsetX="@dimen/dream_overlay_clock_ambient_text_shadow_dx" app:ambientShadowOffsetY="@dimen/dream_overlay_clock_ambient_text_shadow_dy" app:ambientShadowAlpha="0.3" - /> + app:removeTextDescent="true" + app:textDescentExtraPadding="@dimen/dream_overlay_clock_text_descent_extra_padding" /> </FrameLayout> diff --git a/packages/SystemUI/res/layout/dream_overlay_container.xml b/packages/SystemUI/res/layout/dream_overlay_container.xml index 8e83b4abe0dc..ae0a9374fd2c 100644 --- a/packages/SystemUI/res/layout/dream_overlay_container.xml +++ b/packages/SystemUI/res/layout/dream_overlay_container.xml @@ -25,11 +25,12 @@ android:id="@+id/dream_overlay_content" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dream_overlay_container_margin_top" - android:layout_marginEnd="@dimen/dream_overlay_container_margin_end" - android:layout_marginBottom="@dimen/dream_overlay_container_margin_bottom" - android:layout_marginStart="@dimen/dream_overlay_container_margin_start" - + android:paddingTop="@dimen/dream_overlay_container_padding_top" + android:paddingEnd="@dimen/dream_overlay_container_padding_end" + android:paddingBottom="@dimen/dream_overlay_container_padding_bottom" + android:paddingStart="@dimen/dream_overlay_container_padding_start" + android:clipToPadding="false" + android:clipChildren="false" app:layout_constraintTop_toBottomOf="@id/dream_overlay_status_bar" app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/packages/SystemUI/res/layout/window_magnification_settings_view.xml b/packages/SystemUI/res/layout/window_magnification_settings_view.xml index 3d0741c80450..db8191baa790 100644 --- a/packages/SystemUI/res/layout/window_magnification_settings_view.xml +++ b/packages/SystemUI/res/layout/window_magnification_settings_view.xml @@ -63,7 +63,8 @@ android:background="@drawable/accessibility_magnification_setting_view_image_btn_bg" android:src="@drawable/ic_magnification_menu_small" android:tint="@color/accessibility_magnification_image_button_tint" - android:tintMode="src_atop" /> + android:tintMode="src_atop" + android:contentDescription="@string/accessibility_magnification_small" /> <ImageButton android:id="@+id/magnifier_medium_button" @@ -74,7 +75,8 @@ android:background="@drawable/accessibility_magnification_setting_view_image_btn_bg" android:src="@drawable/ic_magnification_menu_medium" android:tint="@color/accessibility_magnification_image_button_tint" - android:tintMode="src_atop" /> + android:tintMode="src_atop" + android:contentDescription="@string/accessibility_magnification_medium" /> <ImageButton android:id="@+id/magnifier_large_button" @@ -85,7 +87,8 @@ android:background="@drawable/accessibility_magnification_setting_view_image_btn_bg" android:src="@drawable/ic_magnification_menu_large" android:tint="@color/accessibility_magnification_image_button_tint" - android:tintMode="src_atop" /> + android:tintMode="src_atop" + android:contentDescription="@string/accessibility_magnification_large" /> <ImageButton android:id="@+id/magnifier_full_button" @@ -96,15 +99,16 @@ android:background="@drawable/accessibility_magnification_setting_view_image_btn_bg" android:src="@drawable/ic_open_in_full" android:tint="@color/accessibility_magnification_image_button_tint" - android:tintMode="src_atop" /> + android:tintMode="src_atop" + android:contentDescription="@string/accessibility_magnification_fullscreen" /> </LinearLayout> <LinearLayout + android:id="@+id/magnifier_horizontal_lock_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="@dimen/magnification_setting_view_margin" - android:layout_marginBottom="@dimen/magnification_setting_view_margin" android:focusable="true"> <TextView @@ -132,6 +136,7 @@ android:layout_height="wrap_content" android:text="@string/accessibility_magnification_zoom" android:textAppearance="@style/TextAppearance.MagnificationSetting.Title" + android:layout_marginTop="@dimen/magnification_setting_view_margin" android:focusable="true" /> <com.android.systemui.common.ui.view.SeekBarWithIconButtonsView diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 8e4cc430f491..73a77bdbd36c 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktiveer USB"</string> <string name="learn_more" msgid="4690632085667273811">"Kom meer te wete"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skermkiekie"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Verleng Ontsluiting is gedeaktiveer"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"het \'n prent gestuur"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Stoor tans skermkiekie..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Stoor tans skermskoot in werkprofiel …"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrole bygevoeg.}other{# kontroles bygevoeg.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Verwyder"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Voeg <xliff:g id="APPNAME">%s</xliff:g> by?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan kies watter kontroles en inhoud hier gewys word."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Verwyder kontroles vir <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"As gunsteling gemerk"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"As gunsteling gemerk; posisie <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"wysig"</string> <string name="add" msgid="81036585205287996">"Voeg by"</string> <string name="manage_users" msgid="1823875311934643849">"Bestuur gebruikers"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Sleep na verdeelde skerm word nie vir hierdie kennisgewing gesteun nie."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Sleep na verdeelde skerm word nie vir hierdie kennisgewing gesteun nie"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑fi onbeskikbaar"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteitmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wekker gestel"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 2991118acf64..4159cca41d48 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -871,8 +871,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# ቁጥጥር ታክሏል።}one{# ቁጥጥር ታክሏል።}other{# ቁጥጥሮች ታክለዋል።}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ተወግዷል"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ይታከል?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> የትኛዎቹ መቆጣጠሪያዎች እና ይዘት እዚህ እንደሚታዩ መምረጥ ይችላል።"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"የ<xliff:g id="APPNAME">%s</xliff:g> መቆጣጠሪያዎች ይወገዱ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ተወዳጅ የተደረገ"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ተወዳጅ ተደርጓል፣ አቋም <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"አርትዕ"</string> <string name="add" msgid="81036585205287996">"አክል"</string> <string name="manage_users" msgid="1823875311934643849">"ተጠቃሚዎችን ያስተዳድሩ"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ይህ ማሳወቂያ ወደ Splitscreen መጎተትን አይደግፍም።"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ይህ ማሳወቂያ ወደ የተከፈለ ማያ ገጽ መጎተትን አይደግፍም"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi አይገኝም"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"የቅድሚያ ሁነታ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ማንቂያ ተቀናብሯል"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 53c0beec55ee..17c3d0f75f63 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"تفعيل USB"</string> <string name="learn_more" msgid="4690632085667273811">"مزيد من المعلومات"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"لقطة شاشة"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"تم إيقاف ميزة Extend Unlock."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"أرسَل صورة"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"جارٍ حفظ لقطة الشاشة..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"جارٍ حفظ لقطة الشاشة في الملف الشخصي للعمل…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"التعديل"</string> <string name="add" msgid="81036585205287996">"إضافة"</string> <string name="manage_users" msgid="1823875311934643849">"إدارة المستخدمين"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"لا يتيح هذا الإشعار السحب لتقسيم الشاشة."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"لا يتيح هذا الإشعار إمكانية السحب لتقسيم الشاشة."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"شبكة Wi‑Fi غير متاحة"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"وضع الأولوية"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"تم ضبط المنبه."</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index d076ed4dfd56..95cfcb41a1c0 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB সক্ষম কৰক"</string> <string name="learn_more" msgid="4690632085667273811">"অধিক জানক"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্ৰীনশ্বট"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock অক্ষম কৰা আছে"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"কৰ্মস্থানৰ প্ৰ’ফাইলত স্ক্ৰীনশ্বট ছেভ কৰি থকা হৈছে…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# টা নিয়ন্ত্ৰণ যোগ দিয়া হৈছে।}one{# টা নিয়ন্ত্ৰণ যোগ দিয়া হৈছে।}other{# টা নিয়ন্ত্ৰণ যোগ দিয়া হৈছে।}}"</string> <string name="controls_removed" msgid="3731789252222856959">"আঁতৰোৱা হ’ল"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> যোগ দিবনে?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g>এ ইয়াত কোনবোৰ নিয়ন্ত্ৰণ আৰু সমল দেখুওৱা হ’ব সেয়া বাছনি কৰিব পাৰে।"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g>ৰ নিয়ন্ত্ৰণ আঁতৰাবনে?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"প্ৰিয় হিচাপে চিহ্নিত কৰা হ’ল"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"প্ৰিয় হিচাপে চিহ্নিত কৰা হ’ল, স্থান <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"সম্পাদনা কৰক"</string> <string name="add" msgid="81036585205287996">"যোগ দিয়ক"</string> <string name="manage_users" msgid="1823875311934643849">"ব্যৱহাৰকাৰী পৰিচালনা কৰক"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"এই জাননীটোৱে টানি আনি এৰাৰ পৰা বিভাজিত স্ক্ৰীন সমৰ্থন নকৰে।"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"এই জাননীটোৱে বিভাজিত স্ক্ৰীনলৈ টানি আনি এৰাৰ সুবিধাটো সমৰ্থন নকৰে"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ৱাই-ফাই উপলব্ধ নহয়"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"অগ্ৰাধিকাৰ ম’ড"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"এলাৰ্ম ছেট কৰা হ’ল"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index e62557742f32..7e26882337c9 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB-ni aktiv edin"</string> <string name="learn_more" msgid="4690632085667273811">"Ətraflı məlumat"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skrinşot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock deaktiv edilib"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"şəkil göndərdi"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinşot yadda saxlanır..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"İş profili skrinşotu saxlanılır…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# nizamlayıcı əlavə edilib.}other{# nizamlayıcı əlavə edilib.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Silinib"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> əlavə edilsin?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> burada göstəriləcək nizamlayıcı və kontenti seçə bilər."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> nizamlayıcıları silinsin?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Sevimlilərə əlavə edilib"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Sevimlilərə əlavə edilib, sıra: <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"redaktə"</string> <string name="add" msgid="81036585205287996">"Əlavə edin"</string> <string name="manage_users" msgid="1823875311934643849">"İstifadəçiləri idarə edin"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Bu bildiriş Ayrılmış ekrana sürüşdürməyi dəstəkləmir."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Bu bildiriş bölünmüş ekrana sürüşdürməyi dəstəkləmir"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi əlçatan deyil"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritet rejimi"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Siqnal ayarlanıb"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 4f122ecbf3ab..6f36211f8e4a 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Omogući USB"</string> <string name="learn_more" msgid="4690632085667273811">"Saznajte više"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snimak ekrana"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Produženo otključavanje je onemogućeno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslao/la sliku"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Čuvanje snimka ekrana..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Snimak ekrana se čuva na poslovnom profilu…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrola je dodata.}one{# kontrola je dodata.}few{# kontrole su dodate.}other{# kontrola je dodato.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Uklonjeno"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Želite li da dodate <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> može da odabere koje kontrole i sadržaj se prikazuju ovde."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Želite da uklonite kontrole za <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Označeno je kao omiljeno"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Označeno je kao omiljeno, <xliff:g id="NUMBER">%d</xliff:g>. pozicija"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"izmenite"</string> <string name="add" msgid="81036585205287996">"Dodaj"</string> <string name="manage_users" msgid="1823875311934643849">"Upravljajte korisnicima"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ovo obaveštenje ne podržava prevlačenje na podeljeni ekran."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ovo obaveštenje ne podržava prevlačenje na podeljeni ekran"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi nije dostupan"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetni režim"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je podešen"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 401898335b5f..0b3042830634 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Уключыць USB"</string> <string name="learn_more" msgid="4690632085667273811">"Даведацца больш"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Здымак экрана"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Функцыя падоўжанай разблакіроўкі адключана"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"адпраўлены відарыс"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Захаванне скрыншота..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Захаванне здымка экрана ў працоўны профіль…"</string> @@ -1067,7 +1066,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"змяніць"</string> <string name="add" msgid="81036585205287996">"Дадаць"</string> <string name="manage_users" msgid="1823875311934643849">"Кіраванне карыстальнікамі"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Гэта апавяшчэнне нельга перацягнуць на падзелены экран."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Сетка Wi‑Fi недаступная"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Прыярытэтны рэжым"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будзільнік зададзены"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 6a653036beee..dd4c4e8709a1 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Активиране на USB"</string> <string name="learn_more" msgid="4690632085667273811">"Научете повече"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Екранна снимка"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Удълженото отключване е деактивирано"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"изпратено изображение"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Екранната снимка се запазва..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Екранната снимка се запазва в служебния профил…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Добавена е # контрола.}other{Добавени са # контроли.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Премахнато"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Да се добави ли <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> може да избира съдържанието и контролите, които да се показват тук."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Да се премахнат ли контролите за <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Означено като любимо"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Означено като любимо – позиция <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"редактиране"</string> <string name="add" msgid="81036585205287996">"Добавяне"</string> <string name="manage_users" msgid="1823875311934643849">"Управление на потребителите"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Това известие не поддържа плъзгане за разделяне на екрана."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi не е налице"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетен режим"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будилникът е зададен"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 373f6b4f5aac..1d7d607c43ba 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{#টি কন্ট্রোল যোগ করা হয়েছে।}one{#টি কন্ট্রোল যোগ করা হয়েছে।}other{#টি কন্ট্রোল যোগ করা হয়েছে।}}"</string> <string name="controls_removed" msgid="3731789252222856959">"সরানো হয়েছে"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> যোগ করবেন?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"এখানে কোন কন্ট্রোল ও কন্টেন্ট দেখানো হবে <xliff:g id="APPNAME">%s</xliff:g> তা বেছে নিতে পারবে।"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g>-এর জন্য নিয়ন্ত্রণ সরিয়ে দেবেন?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"পছন্দসই হিসেবে চিহ্নিত করেছেন"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"পছন্দসই হিসেবে চিহ্নিত করেছেন, অবস্থান <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"এডিট করতে"</string> <string name="add" msgid="81036585205287996">"যোগ করুন"</string> <string name="manage_users" msgid="1823875311934643849">"ব্যবহারকারীদের ম্যানেজ করুন"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"স্প্লিটস্ক্রিন মোডে এই বিজ্ঞপ্তি টেনে আনা যাবে না।"</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ওয়াই-ফাই উপলভ্য নেই"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"প্রায়োরিটি মোড"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"অ্যালার্ম সেট করা হয়েছে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 627531ae87fa..62eafb401050 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Omogući USB"</string> <string name="learn_more" msgid="4690632085667273811">"Saznajte više"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snimak ekrana"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Produljivanje otključavanja onemogućeno"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Produženo otključavanje je onemogućeno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslao/la sliku"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Spašavanje snimka ekrana..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pohranjivanje snimka ekrana na radni profil…"</string> @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Dodana je # kontrola.}one{Dodana je # kontrola.}few{Dodane su # kontrole.}other{Dodano je # kontrola.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Uklonjeno"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Dodati aplikaciju <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Aplikacija <xliff:g id="APPNAME">%s</xliff:g> može odabrati koje će kontrole i sadržaj prikazivati ovdje."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Ukloniti kontrole za aplikaciju <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Dodano u omiljeno"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Dodano u omiljeno, pozicija <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"uredi"</string> <string name="add" msgid="81036585205287996">"Dodaj"</string> <string name="manage_users" msgid="1823875311934643849">"Upravljajte korisnicima"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ovo obavještenje ne podržava prevlačenje na podijeljeni ekran."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ovo obavještenje ne podržava prevlačenje na podijeljeni ekran"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi je nedostupan"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Način rada Prioriteti"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je postavljen"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index faae1a83c440..42649d125436 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activa l\'USB"</string> <string name="learn_more" msgid="4690632085667273811">"Més informació"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock desactivat"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviat una imatge"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"S\'està desant la captura de pantalla..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"S\'està desant la captura al perfil de treball…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{S\'ha afegit # control.}many{S\'han afegit # controls.}other{S\'han afegit # controls.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Suprimit"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vols afegir <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pot triar quins controls i continguts es mostren aquí."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vols suprimir els controls per a <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Afegit als preferits"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Afegit als preferits, posició <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Afegeix"</string> <string name="manage_users" msgid="1823875311934643849">"Gestiona els usuaris"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Aquesta notificació no es pot arrossegar a la pantalla dividida."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Aquesta notificació no es pot arrossegar a la pantalla dividida"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi no disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode Prioritat"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma definida"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 560ee4d30a50..13b87f18891d 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivovat USB"</string> <string name="learn_more" msgid="4690632085667273811">"Další informace"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímek obrazovky"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Prodloužení odemknutí deaktivováno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odesílá obrázek"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ukládání snímku obrazovky..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ukládání snímku obrazovky do pracovního profilu…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"upravit"</string> <string name="add" msgid="81036585205287996">"Přidat"</string> <string name="manage_users" msgid="1823875311934643849">"Správa uživatelů"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Toto oznámení nepodporuje přetažení na rozdělenou obrazovku."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Toto oznámení nepodporuje přetažení na rozdělenou obrazovku"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Síť Wi‑Fi není k dispozici"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritní režim"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Je nastaven budík"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 5f7fc697d098..815b40224beb 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivér USB"</string> <string name="learn_more" msgid="4690632085667273811">"Få flere oplysninger"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Hold oplåst er deaktiveret"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendte et billede"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gemmer screenshot..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Gemmer screenshot på din arbejdsprofil…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"redigere"</string> <string name="add" msgid="81036585205287996">"Tilføj"</string> <string name="manage_users" msgid="1823875311934643849">"Administrer brugere"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Denne notifikation kan ikke trækkes til en opdelt skærm."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Denne notifikation kan ikke trækkes til en opdelt skærm"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Ingen tilgængelig Wi-Fi-forbindelse"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tilstanden Prioritet"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmen er indstillet"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index caac9ebb10e9..a3dcf62a3b4d 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB aktivieren"</string> <string name="learn_more" msgid="4690632085667273811">"Weitere Informationen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"„Extend Unlock“ deaktiviert"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"Bild gesendet"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot wird gespeichert..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Screenshot wird in Arbeitsprofil gespeichert…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# Steuerelement hinzugefügt.}other{# Steuerelemente hinzugefügt.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Entfernt"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> hinzufügen?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> darf auswählen, welche Einstellungen und Inhalte hier angezeigt werden."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Einstellungen für <xliff:g id="APPNAME">%s</xliff:g> entfernen?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Zu Favoriten hinzugefügt"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Zu Favoriten hinzugefügt, Position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"bearbeiten"</string> <string name="add" msgid="81036585205287996">"Hinzufügen"</string> <string name="manage_users" msgid="1823875311934643849">"Nutzer verwalten"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Diese Benachrichtigung lässt sich nicht auf einen geteilten Bildschirm ziehen."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN nicht verfügbar"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritätsmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wecker gestellt"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 7dd3593b93b6..4c76e1712ee6 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Προστέθηκε # στοιχείο ελέγχου.}other{Προστέθηκαν # στοιχεία ελέγχου.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Καταργήθηκε"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Προσθήκη <xliff:g id="APPNAME">%s</xliff:g>;"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Η εφαρμογή <xliff:g id="APPNAME">%s</xliff:g> μπορεί να επιλέξει τα στοιχεία ελέγχου και το περιεχόμενο που θα εμφανίζεται εδώ."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Κατάργηση στοιχείων ελέγχου για την εφαρμογή <xliff:g id="APPNAME">%s</xliff:g>;"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Προστέθηκε στα αγαπημένα"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Προστέθηκε στα αγαπημένα, στη θέση <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"επεξεργασία"</string> <string name="add" msgid="81036585205287996">"Προσθήκη"</string> <string name="manage_users" msgid="1823875311934643849">"Διαχείριση χρηστών"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Αυτή η ειδοποίηση δεν υποστηρίζει τη μεταφορά με σύρσιμο για χρήση του διαχωρισμού οθόνης."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Αυτή η ειδοποίηση δεν υποστηρίζει τη μεταφορά με σύρσιμο για τον διαχωρισμό οθόνης"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Το Wi‑Fi δεν είναι διαθέσιμο"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Λειτουργία προτεραιότητας"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Το ξυπνητήρι ρυθμίστηκε"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index f2e0c26626f4..80868289e985 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control added.}other{# controls added.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removed"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Add <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> can choose which controls and content show here."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remove controls for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favourited"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favourited, position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Add"</string> <string name="manage_users" msgid="1823875311934643849">"Manage users"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"This notification does not support dragging to Split screen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index fb7221851328..c53db1824d0a 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control added.}other{# controls added.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removed"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Add <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> can choose which controls and content show here."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remove controls for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favorited"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favorited, position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Add"</string> <string name="manage_users" msgid="1823875311934643849">"Manage users"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"This notification does not support dragging to Splitscreen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index f2e0c26626f4..80868289e985 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control added.}other{# controls added.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removed"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Add <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> can choose which controls and content show here."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remove controls for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favourited"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favourited, position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Add"</string> <string name="manage_users" msgid="1823875311934643849">"Manage users"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"This notification does not support dragging to Split screen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index f2e0c26626f4..80868289e985 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control added.}other{# controls added.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removed"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Add <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> can choose which controls and content show here."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remove controls for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favourited"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favourited, position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Add"</string> <string name="manage_users" msgid="1823875311934643849">"Manage users"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"This notification does not support dragging to Split screen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 5ea3dd68b380..11c7db8cea74 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control added.}other{# controls added.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removed"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Add <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> can choose which controls and content show here."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remove controls for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favorited"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favorited, position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Add"</string> <string name="manage_users" msgid="1823875311934643849">"Manage users"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"This notification does not support dragging to Splitscreen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"This notification does not support dragging to split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi unavailable"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm set"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 9853c9ba78c3..8f3fc6f0dadb 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Se agregó # control.}many{Se agregaron # controles.}other{Se agregaron # controles.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Quitados"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"¿Quieres agregar <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> puede elegir qué controles y contenido mostrar aquí."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"¿Quieres quitar los controles para <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Está en favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Está en favoritos en la posición <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Agregar"</string> <string name="manage_users" msgid="1823875311934643849">"Administrar usuarios"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificación no admite arrastrar entre pantallas divididas."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"La red Wi-Fi no está disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioridad"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Se estableció la alarma"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2e5b4d12f539..a4c4dd05ab4f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Habilitar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Más información"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock inhabilitado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviado una imagen"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando captura..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Guardando captura en el perfil de trabajo…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control añadido.}many{# controles añadidos.}other{# controles añadidos.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Quitado"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"¿Añadir <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> puede elegir qué controles y contenido se muestran aquí."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"¿Quitar los controles de <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Añadido a favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Añadido a favoritos (posición <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Añadir"</string> <string name="manage_users" msgid="1823875311934643849">"Gestionar usuarios"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificación no se puede arrastrar a la pantalla dividida."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación no se puede arrastrar a la pantalla dividida"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi no disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioritario"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma añadida"</string> @@ -1089,7 +1087,7 @@ <string name="log_access_confirmation_title" msgid="4843557604739943395">"¿Permitir que <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> acceda a todos los registros del dispositivo?"</string> <string name="log_access_confirmation_allow" msgid="752147861593202968">"Permitir el acceso una vez"</string> <string name="log_access_confirmation_deny" msgid="2389461495803585795">"No permitir"</string> - <string name="log_access_confirmation_body" msgid="6883031912003112634">"Los registros del dispositivo documentan lo que sucede en tu dispositivo. Las aplicaciones pueden usar estos registros para encontrar y solucionar problemas.\n\nComo algunos registros pueden contener información sensible, es mejor que solo permitas que accedan a ellos las aplicaciones en las que confíes. \n\nAunque no permitas que esta aplicación acceda a todos los registros del dispositivo, aún podrá acceder a sus propios registros. El fabricante de tu dispositivo aún puede acceder a algunos registros o información de tu dispositivo."</string> + <string name="log_access_confirmation_body" msgid="6883031912003112634">"Los registros del dispositivo documentan lo que sucede en tu dispositivo. Las aplicaciones pueden usar estos registros para encontrar y solucionar problemas.\n\nComo algunos registros pueden contener información sensible, es mejor que solo permitas que accedan a ellos las aplicaciones en las que confíes. \n\nAunque no permitas que esta aplicación acceda a todos los registros del dispositivo, podrá seguir accediendo a sus propios registros. Es posible que el fabricante del dispositivo pueda acceder a algunos registros o información de tu dispositivo. Más información"</string> <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Más información"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Más información en <xliff:g id="URL">%s</xliff:g>"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index d0f3a46f31c9..128806070ec1 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Luba USB"</string> <string name="learn_more" msgid="4690632085667273811">"Lisateave"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekraanipilt"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock on keelatud"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"saatis kujutise"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Kuvatõmmise salvestamine ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ekraanipildi salvestamine tööprofiilile …"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Lisati # juhtnupp.}other{Lisati # juhtnuppu.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Eemaldatud"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Kas lisada <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Rakendus <xliff:g id="APPNAME">%s</xliff:g> saab valida, millised juhtelemendid ja milline sisu siin kuvatakse."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Kas soovite rakenduse <xliff:g id="APPNAME">%s</xliff:g> juhtelemendid eemaldada?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Lisatud lemmikuks"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Lisatud lemmikuks, positsioon <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -895,9 +893,9 @@ <string name="controls_dialog_message" msgid="342066938390663844">"Soovitas <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_tile_locked" msgid="731547768182831938">"Seade on lukustatud"</string> <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"Kas soovite seadmete juhtelemente lukustuskuval kuvada ja kasutada?"</string> - <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"Võite lukustuskuvale oma väliste seadmete juhtelemendid lisada.\n\nTeie seadmerakendus võib võimaldada teil teatud seadmeid ilma telefoni või tahvelarvutit avamata hallata.\n\nSaate igal ajal seadetes muudatusi teha."</string> - <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"Kas soovite seadmeid lukustuskuva kaudu hallata?"</string> - <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Võite teatud seadmeid ilma telefoni või tahvelarvutit avamata hallata. Teie seadmerakendus määrab, milliseid seadmeid saab sel viisil hallata."</string> + <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"Võite lukustuskuvale oma väliste seadmete juhtelemendid lisada.\n\nTeie seadmerakendus võib võimaldada teil teatud seadmeid ilma telefoni või tahvelarvutit avamata juhtida.\n\nSaate igal ajal seadetes muudatusi teha."</string> + <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"Kas soovite seadmeid lukustuskuva kaudu juhtida?"</string> + <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Võite teatud seadmeid ilma telefoni või tahvelarvutit avamata juhtida. Teie seadmerakendus määrab, milliseid seadmeid saab sel viisil juhtida."</string> <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"Tänan, ei"</string> <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"Jah"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-kood sisaldab tähti või sümboleid"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"muutmine"</string> <string name="add" msgid="81036585205287996">"Lisa"</string> <string name="manage_users" msgid="1823875311934643849">"Kasutajate haldamine"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"See märguanne ei toeta jagatud ekraanikuvale lohistamist."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi pole saadaval"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Režiim Prioriteetne"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm on määratud"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 05c08c8e4d3e..4873d88ce0c9 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Gaitu USB ataka"</string> <string name="learn_more" msgid="4690632085667273811">"Lortu informazio gehiago"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pantaila-argazkia"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desgaitu da desblokeatze luzatua"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"erabiltzaileak irudi bat bidali du"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Pantaila-argazkia gordetzen…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pantaila-argazkia laneko profilean gordetzen…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Kontrolatzeko # aukera gehitu da.}other{Kontrolatzeko # aukera gehitu dira.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Kenduta"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> gehitu nahi duzu?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Hemen zein kontrolatzeko aukera eta eduki agertzen diren aukera dezake <xliff:g id="APPNAME">%s</xliff:g> aplikazioak."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> kontrolatzeko aukerak kendu nahi dituzu?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Gogokoetan dago"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"<xliff:g id="NUMBER">%d</xliff:g>. gogokoa da"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editatzeko"</string> <string name="add" msgid="81036585205287996">"Gehitu"</string> <string name="manage_users" msgid="1823875311934643849">"Kudeatu erabiltzaileak"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Jakinarazpen hau ezin da arrastatu pantaila zatitura."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Jakinarazpen hau ezin da arrastatu pantaila zatitura"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wifi-konexioa ez dago erabilgarri"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Lehentasun modua"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma ezarrita dago"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 9c9620fb165d..f62ab7767e11 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"فعال کردن USB"</string> <string name="learn_more" msgid="4690632085667273811">"بیشتر بدانید"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"نماگرفت"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock غیرفعال شده است"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"تصویری ارسال کرد"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"درحال ذخیره نماگرفت…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"درحال ذخیره کردن نماگرفت در نمایه کاری…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# کنترل اضافه شد.}one{# کنترل اضافه شد.}other{# کنترل اضافه شد.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"حذف شد"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> افزوده شود؟"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> میتواند انتخاب کند چه کنترلها و محتوایی اینجا نشان داده شود."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"کنترلهای <xliff:g id="APPNAME">%s</xliff:g> برداشته شود؟"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"به موارد دلخواه اضافه شد"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"اضافهشده به موارد دلخواه، جایگاه <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ویرایش کردن"</string> <string name="add" msgid="81036585205287996">"افزودن"</string> <string name="manage_users" msgid="1823875311934643849">"مدیریت کاربران"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"این اعلان از تنظیم کشیدن برای دو نیمه کردن صفحه پشتیبانی نمیکند."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi دردسترس نیست"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"حالت اولویت"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"زنگ ساعت تنظیم شد"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index a4fd4d900362..e478bd2c1053 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ota USB käyttöön"</string> <string name="learn_more" msgid="4690632085667273811">"Lue lisää"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Kuvakaappaus"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock poistettu käytöstä"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"lähetti kuvan"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Tallennetaan kuvakaappausta..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Kuvakaappausta tallennetaan työprofiiliin…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"muokkaa"</string> <string name="add" msgid="81036585205287996">"Lisää"</string> <string name="manage_users" msgid="1823875311934643849">"Ylläpidä käyttäjiä"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ilmoitus ei tue jaetulle näytölle vetämistä."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ilmoitus ei tue jaetulle näytölle vetämistä"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ei ole saatavilla"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tärkeät-tila"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Hälytys asetettu"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 8f4c89711b00..bb26ad4daf08 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activer l\'USB"</string> <string name="learn_more" msgid="4690632085667273811">"En savoir plus"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock désactivée"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement capture écran…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Sauv. de la capture dans le profil prof. en cours…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"modifier"</string> <string name="add" msgid="81036585205287996">"Ajouter"</string> <string name="manage_users" msgid="1823875311934643849">"Gérer les utilisateurs"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Cette notification ne prend pas en charge le partage d\'écran par glissement."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Cette notification ne prend pas en charge l\'écran partagé par glissement"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi non disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode priorité"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"L\'alarme a été réglée"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 16140d087643..fb0d42cc005c 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activer le port USB"</string> <string name="learn_more" msgid="4690632085667273811">"En savoir plus"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Déverrouillage étendu désactivé"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement de la capture d\'écran…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Enregistrement de capture d\'écran dans profil pro…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}many{# commandes ajoutées.}other{# commandes ajoutées.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Ajouter <xliff:g id="APPNAME">%s</xliff:g> ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> peut choisir les commandes et contenus à afficher ici."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Supprimer les commandes pour <xliff:g id="APPNAME">%s</xliff:g> ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ajouté aux favoris"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ajouté aux favoris, en position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"modifier"</string> <string name="add" msgid="81036585205287996">"Ajouter"</string> <string name="manage_users" msgid="1823875311934643849">"Gérer les utilisateurs"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Impossible de faire glisser cette notification vers l\'écran partagé."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi non disponible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode Prioritaire"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme réglée"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 815029b50216..ac8acde485ba 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Máis información"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Facer captura"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desactivouse o desbloqueo ampliado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou unha imaxe"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gardando captura de pantalla…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Gardando captura de pantalla no perfil de traballo"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Engadir"</string> <string name="manage_users" msgid="1823875311934643849">"Xestionar usuarios"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificación non pode arrastrarse á pantalla dividida."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación non pode arrastrarse á pantalla dividida"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"A wifi non está dispoñible"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo de prioridade"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarma definida"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 3d32c7f85bed..1267200dd762 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ચાલુ કરો"</string> <string name="learn_more" msgid="4690632085667273811">"વધુ જાણો"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"સ્ક્રીનશૉટ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlockની સુવિધા બંધ કરવામાં આવી"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"છબી મોકલી"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ઑફિસની પ્રોફાઇલમાં સ્ક્રીનશૉટ સાચવી રહ્યાં છીએ…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# નિયંત્રણ ઉમેર્યું.}one{# નિયંત્રણ ઉમેર્યું.}other{# નિયંત્રણ ઉમેર્યા.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"કાઢી નાખ્યું"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ઉમેરીએ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> પસંદ કરી શકે છે કે કયા નિયંત્રણો અને કન્ટેન્ટ અહીં બતાવવામાં આવે."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> માટે નિયંત્રણો કાઢી નાખીએ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"મનપસંદમાં ઉમેર્યું"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"મનપસંદમાં ઉમેર્યું, સ્થાન <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ફેરફાર કરો"</string> <string name="add" msgid="81036585205287996">"ઉમેરો"</string> <string name="manage_users" msgid="1823875311934643849">"વપરાશકર્તાઓને મેનેજ કરો"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"આ નોટિફિકેશન તેને સ્પ્લિટસ્ક્રીનમાં ખેંચવાની સુવિધાને સપોર્ટ કરતું નથી."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"આ નોટિફિકેશન તેને વિભાજિત સ્ક્રીનમાં ખેંચવાની સુવિધાને સપોર્ટ કરતું નથી"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"વાઇ-ફાઇ ઉપલબ્ધ નથી"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"પ્રાધાન્યતા મોડ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"અલાર્મ સેટ"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 5a88b5dd1228..f1ff61687402 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"यूएसबी चालू करें"</string> <string name="learn_more" msgid="4690632085667273811">"ज़्यादा जानें"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रीनशॉट"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock की सुविधा बंद की गई"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"एक इमेज भेजी गई"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रीनशॉट सहेजा जा रहा है..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"स्क्रीनशॉट, वर्क प्रोफ़ाइल में सेव किया जा रहा है…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# कंट्रोल जोड़ा गया.}one{# कंट्रोल जोड़ा गया.}other{# कंट्रोल जोड़े गए.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"हटाया गया"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> को जोड़ना है?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> यह चुन सकता है कि इस पैनल पर कौनसे कंट्रोल और कॉन्टेंट दिखे."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> के लिए कंट्रोल हटाने हैं?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"पसंदीदा बनाया गया"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"पसंदीदा बनाया गया, क्रम संख्या <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"बदलाव करें"</string> <string name="add" msgid="81036585205287996">"जोड़ें"</string> <string name="manage_users" msgid="1823875311934643849">"उपयोगकर्ताओं को मैनेज करें"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"इस सूचना को स्प्लिट स्क्रीन मोड में, खींचा और छोड़ा नहीं जा सकता."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"इस सूचना को स्प्लिट स्क्रीन मोड में, खींचा और छोड़ा नहीं जा सकता"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"वाई-फ़ाई उपलब्ध नहीं है"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"प्राथमिकता मोड"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"अलार्म सेट किया गया"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index c89a590d4302..4ece4b61478c 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Dodana je # kontrola.}one{Dodana je # kontrola.}few{Dodane su # kontrole.}other{Dodano je # kontrola.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Uklonjeno"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Želite li dodati aplikaciju <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"U aplikaciji <xliff:g id="APPNAME">%s</xliff:g> možete odabrati koje se kontrole i sadržaj ovdje prikazuju."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Ukloniti kontrole za aplikaciju <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Dodano u favorite"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Dodano u favorite, položaj <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"uredi"</string> <string name="add" msgid="81036585205287996">"Dodaj"</string> <string name="manage_users" msgid="1823875311934643849">"Upravljanje korisnicima"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ova obavijest ne podržava povlačenje na podijeljeni zaslon."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ova obavijest ne podržava povlačenje na podijeljeni zaslon."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nije dostupan"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetni način rada"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je postavljen"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 96931df75d43..8d38e1fdaf2c 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB engedélyezése"</string> <string name="learn_more" msgid="4690632085667273811">"Részletek"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Képernyőkép"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock letiltva"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"képet küldött"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Képernyőkép mentése..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Képernyőkép mentése a munkaprofilba…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# vezérlő hozzáadva.}other{# vezérlő hozzáadva.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Eltávolítva"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Hozzáadja a(z) <xliff:g id="APPNAME">%s</xliff:g> alkalmazást?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"A(z) <xliff:g id="APPNAME">%s</xliff:g> eldöntheti, milyen vezérlőket és tartalmakat jelenít meg itt."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Eltávolítja a(z) <xliff:g id="APPNAME">%s</xliff:g> vezérlőit?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Hozzáadva a kedvencekhez"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Hozzáadva a kedvencekhez <xliff:g id="NUMBER">%d</xliff:g>. helyen"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"szerkesztés"</string> <string name="add" msgid="81036585205287996">"Hozzáadás"</string> <string name="manage_users" msgid="1823875311934643849">"Felhasználók kezelése"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Az értesítés nem támogatja a megosztott képernyőre való áthúzást."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Az értesítés nem támogatja az osztott képernyőre való áthúzást."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"A Wi‑Fi nem áll rendelkezésre"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritás mód"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Ébresztő beállítva"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index b85283684fd8..ed4b312af3b1 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Միացնել USB-ն"</string> <string name="learn_more" msgid="4690632085667273811">"Իմանալ ավելին"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Սքրինշոթ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"«Երկարացնել կողպումը» գործառույթն անջատված է"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"պատկեր է ուղարկվել"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Սքրինշոթը պահվում է..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Սքրինշոթը պահվում է աշխատանքային պրոֆիլում…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"փոփոխել"</string> <string name="add" msgid="81036585205287996">"Ավելացնել"</string> <string name="manage_users" msgid="1823875311934643849">"Օգտատերերի կառավարում"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Այս ծանուցումը հնարավոր չէ քաշել տրոհված էկրանի մեկ հատվածից մյուսը։"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Այս ծանուցումը հնարավոր չէ քաշել տրոհված էկրանի մեկ հատվածից մյուսը"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi-ը հասանելի չէ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Առաջնահերթության ռեժիմ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Զարթուցիչը դրված է"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index e293b9b9bb75..72f715835f2c 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktifkan USB"</string> <string name="learn_more" msgid="4690632085667273811">"Pelajari lebih lanjut"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock dinonaktifkan"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"mengirim gambar"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan screenshot..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Menyimpan screenshot ke profil kerja …"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrol ditambahkan.}other{# kontrol ditambahkan.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Dihapus"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Tambahkan <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> dapat memilih kontrol dan konten yang ditampilkan di sini."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Hapus kontrol untuk <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Difavoritkan"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Difavoritkan, posisi <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"mengedit"</string> <string name="add" msgid="81036585205287996">"Tambahkan"</string> <string name="manage_users" msgid="1823875311934643849">"Kelola pengguna"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Notifikasi ini tidak mendukung fitur tarik ke Layar terpisah."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Notifikasi ini tidak mendukung fitur tarik ke layar terpisah"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi tidak tersedia"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode prioritas"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm disetel"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 1e6b6ed3c9ca..d84e544d99af 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Virkja USB"</string> <string name="learn_more" msgid="4690632085667273811">"Frekari upplýsingar"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjámynd"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Slökkt á Extend Unlock"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendi mynd"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Vistar skjámynd…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Vistar skjámynd á vinnusnið…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# stýringu bætt við.}one{# stýringu bætt við.}other{# stýringum bætt við.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Fjarlægt"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Viltu bæta <xliff:g id="APPNAME">%s</xliff:g> við?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> getur valið hvaða stýringar og efni birtist hér."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Fjarlægja stýringar fyrir <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Eftirlæti"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Eftirlæti, staða <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"breyta"</string> <string name="add" msgid="81036585205287996">"Bæta við"</string> <string name="manage_users" msgid="1823875311934643849">"Stjórna notendum"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Þessi tilkynning styður ekki að draga yfir á skiptan skjá."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Þessi tilkynning styður ekki að draga yfir á skiptan skjá."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi ekki tiltækt"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Forgangsstilling"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Vekjari stilltur"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index a3da7072c573..d103e41d61bd 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -799,7 +799,7 @@ <string name="slice_permission_deny" msgid="6870256451658176895">"Rifiuta"</string> <string name="auto_saver_title" msgid="6873691178754086596">"Tocca per programmare il Risparmio energetico"</string> <string name="auto_saver_text" msgid="3214960308353838764">"Attiva questa funzionalità se è probabile che la batteria si scarichi"</string> - <string name="no_auto_saver_action" msgid="7467924389609773835">"No grazie"</string> + <string name="no_auto_saver_action" msgid="7467924389609773835">"No, grazie"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump heap SysUI"</string> <string name="ongoing_privacy_dialog_a11y_title" msgid="2205794093673327974">"In uso"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Le app stanno usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> @@ -1066,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"modificare"</string> <string name="add" msgid="81036585205287996">"Aggiungi"</string> <string name="manage_users" msgid="1823875311934643849">"Gestisci utenti"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Non è possibile trascinare questa notifica tra le due parti dello schermo diviso."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Non è possibile trascinare questa notifica tra le due parti dello schermo diviso"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi non disponibile"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modalità Priorità"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Sveglia impostata"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 3a2e0401bcad..8c9667c36b62 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"הפעלת USB"</string> <string name="learn_more" msgid="4690632085667273811">"מידע נוסף"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"צילום מסך"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"התכונה \'הרחבה של ביטול הנעילה\' מושבתת"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"נשלחה תמונה"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"המערכת שומרת את צילום המסך..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"צילום המסך נשמר בפרופיל העבודה…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{נוסף אמצעי בקרה אחד (#).}one{נוספו # אמצעי בקרה.}two{נוספו # אמצעי בקרה.}other{נוספו # אמצעי בקרה.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"הוסר"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"להוסיף את <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"האפליקציה <xliff:g id="APPNAME">%s</xliff:g> יכולה לבחור אילו אמצעי בקרה ותוכן להראות כאן."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"להסיר את אמצעי הבקרה של <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"סומן כמועדף"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"סומן כמועדף, במיקום <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"עריכה"</string> <string name="add" msgid="81036585205287996">"הוספה"</string> <string name="manage_users" msgid="1823875311934643849">"ניהול משתמשים"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ההתראה הזו לא תומכת בגרירה למסך מפוצל."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ההתראה הזו לא תומכת בגרירה למסך מפוצל"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi לא זמין"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"מצב עדיפות"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ההתראה מוגדרת"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 550a19e3cbde..2fb65a88c1b1 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1066,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"編集"</string> <string name="add" msgid="81036585205287996">"追加"</string> <string name="manage_users" msgid="1823875311934643849">"ユーザーの管理"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"この通知は、分割画面へのドラッグがサポートされていません。"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"この通知は、分割画面へのドラッグをサポートしていません"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi を利用できません"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先順位モード"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"アラームを設定しました"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 8e954881ac57..67852eae3c8f 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{დაემატა მართვის # საშუალება.}other{დაემატა მართვის # საშუალება.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ამოიშალა"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"გსურთ <xliff:g id="APPNAME">%s</xliff:g>-ის დამატება?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g>-ს შეუძლია აირჩიოს, მართვის რომელი საშუალებები და კონტენტი უნდა გამოჩნდეს აქ."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"ამოიშალოს <xliff:g id="APPNAME">%s</xliff:g>-ის მართვის საშუალებები?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"რჩეულებშია"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"რჩეულებშია, პოზიციაზე <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"რედაქტირება"</string> <string name="add" msgid="81036585205287996">"დამატება"</string> <string name="manage_users" msgid="1823875311934643849">"მომხმარებლების მართვა"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ამ შეტყობინების გადათრევა გაყოფილ ეკრანებს შორის არ არის მხარდაჭერილი."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ამ შეტყობინების გადათრევა გაყოფილ ეკრანებს შორის არ არის მხარდაჭერილი."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi მიუწვდომელია"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"პრიორიტეტული რეჟიმი"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"მაღვიძარა დაყენებულია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 08b4879589d9..fb0688dcdc62 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB қосу"</string> <string name="learn_more" msgid="4690632085667273811">"Толығырақ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Құлыпты ашық ұстау функциясы өшірілді."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"сурет жіберілді"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншотты сақтауда…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Скриншот жұмыс профиліне сақталып жатыр…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# басқару элементі қосылды.}other{# басқару элементі қосылды.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Өшірілді"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> қолданбасын қосу керек пе?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> қолданбасы осы жерде көрсетілетін басқару құралдары мен контентті таңдай алады."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> қолданбасының басқару элементтері жойылсын ба?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Таңдаулыларға қосылды"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Таңдаулыларға қосылды, <xliff:g id="NUMBER">%d</xliff:g>-позиция"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"өзгерту"</string> <string name="add" msgid="81036585205287996">"Қосу"</string> <string name="manage_users" msgid="1823875311934643849">"Пайдаланушыларды басқару"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Бұл хабарландыруды бөлінген экранға сүйреп апару мүмкін емес."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Бұл хабарландыруды бөлінген экранға сүйреп апару мүмкін емес."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi қолжетімсіз"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Басымдық режимі"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Оятқыш орнатылды"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 9cdd5c020e87..1106ef2db0a1 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"បើក USB"</string> <string name="learn_more" msgid="4690632085667273811">"ស្វែងយល់បន្ថែម"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"រូបថតអេក្រង់"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"បានបិទការដោះសោបន្ថែម"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"បានផ្ញើរូបភាព"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"កំពុងរក្សាទុករូបថតអេក្រង់ទៅកម្រងព័ត៌មានការងារ…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{បានបញ្ចូលការគ្រប់គ្រង #។}other{បានបញ្ចូលការគ្រប់គ្រង #។}}"</string> <string name="controls_removed" msgid="3731789252222856959">"បានដកចេញ"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"បញ្ចូល <xliff:g id="APPNAME">%s</xliff:g> ឬ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> អាចជ្រើសរើសឱ្យការគ្រប់គ្រង និងខ្លឹមសារណាខ្លះបង្ហាញនៅទីនេះ។"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"ដកការគ្រប់គ្រងសម្រាប់ <xliff:g id="APPNAME">%s</xliff:g> ចេញឬ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"បានដាក់ជាសំណព្វ"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"បានដាក់ជាសំណព្វ ទីតាំងទី <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"កែ"</string> <string name="add" msgid="81036585205287996">"បញ្ចូល"</string> <string name="manage_users" msgid="1823875311934643849">"គ្រប់គ្រងអ្នកប្រើប្រាស់"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ការជូនដំណឹងនេះមិនអាចឱ្យអូសដើម្បីបំបែកអេក្រង់បានទេ។"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ការជូនដំណឹងនេះមិនអាចឱ្យអូសដើម្បីបំបែកអេក្រង់បានទេ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ត្រូវបានបិទ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"មុខងារអាទិភាព"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"រូបកំណត់ម៉ោងរោទ៍"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index fcdf34d29fc1..f1c2b9189836 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="learn_more" msgid="4690632085667273811">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ಎಕ್ಸ್ಟೆಂಡ್ ಅನ್ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# ನಿಯಂತ್ರಣವನ್ನು ಸೇರಿಸಲಾಗಿದೆ.}one{# ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ.}other{# ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ಅನ್ನು ಸೇರಿಸಬೇಕೆ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> ಯಾವ ಕಂಟ್ರೋಲ್ಗಳು ಮತ್ತು ವಿಷಯವನ್ನು ತೋರಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಬಹುದು."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> ಗಾಗಿ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ಮೆಚ್ಚಲಾಗಿರುವುದು"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ಮೆಚ್ಚಲಾಗಿರುವುದು, ಸ್ಥಾನ <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="add" msgid="81036585205287996">"ಸೇರಿಸಿ"</string> <string name="manage_users" msgid="1823875311934643849">"ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಿ"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ಗೆ ಡ್ರ್ಯಾಗ್ ಮಾಡುವುದನ್ನು ಈ ಅಧಿಸೂಚನೆಯು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ಗೆ ಡ್ರ್ಯಾಗ್ ಮಾಡುವುದನ್ನು ಈ ನೋಟಿಫಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ವೈ-ಫೈ ಲಭ್ಯವಿಲ್ಲ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ಆದ್ಯತೆ ಮೋಡ್"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ಅಲಾರಾಂ ಹೊಂದಿಸಲಾಗಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e3395242eee2..d1f9a2d38476 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB 사용"</string> <string name="learn_more" msgid="4690632085667273811">"자세히 알아보기"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"스크린샷"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"잠금 해제 연장 사용 중지됨"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"이미지 보냄"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"캡쳐화면 저장 중..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"직장 프로필에 스크린샷 저장 중…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{설정이 #개 추가되었습니다.}other{설정이 #개 추가되었습니다.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"삭제됨"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g>을(를) 추가할까요?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g>에서 여기에 표시되는 컨트롤 및 콘텐츠를 선택할 수 있습니다."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> 컨트롤을 삭제할까요?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"즐겨찾기에 추가됨"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"즐겨찾기에 추가됨, 위치 <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"수정"</string> <string name="add" msgid="81036585205287996">"추가"</string> <string name="manage_users" msgid="1823875311934643849">"사용자 관리"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"드래그하여 화면을 분할하는 기능이 지원되지 않는 알림입니다."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"드래그하여 화면을 분할하는 기능이 지원되지 않는 알림입니다."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi를 이용할 수 없습니다."</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"우선순위 모드입니다."</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"알람이 설정되었습니다."</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 77fddefc6bbb..4693950defc8 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB’ни иштетүү"</string> <string name="learn_more" msgid="4690632085667273811">"Кененирээк"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"\"Кулпуну ачуу\" функциясы өчүрүлдү"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"сүрөт жөнөттү"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншот сакталууда..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Скриншот жумуш профилине сакталууда…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# көзөмөл кошулду.}other{# көзөмөл кошулду.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Өчүрүлдү"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> кошулсунбу?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> бул жерде көрсөтүлө турган башкаруу элементтерин жана контентти тандай алат."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> башкаруу элементтери өчүрүлсүнбү?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Сүйүктүүлөргө кошулду"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Сүйүктүүлөргө <xliff:g id="NUMBER">%d</xliff:g>-позицияга кошулду"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"түзөтүү"</string> <string name="add" msgid="81036585205287996">"Кошуу"</string> <string name="manage_users" msgid="1823875311934643849">"Колдонуучуларды башкаруу"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Бул билдирмени бөлүнгөн экранда сүйрөөгө болбойт."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Бул билдирмени бөлүнгөн экранда сүйрөөгө болбойт."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi жеткиликсиз"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Маанилүү сүйлөшүүлөр режими"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Ойготкуч коюлду"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 541b4186423c..21f4312803dc 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"ເປີດໃຊ້ USB"</string> <string name="learn_more" msgid="4690632085667273811">"ສຶກສາເພີ່ມເຕີມ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ພາບໜ້າຈໍ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ຂະຫຍາຍການປົດລັອກຖືກປິດການນຳໃຊ້ແລ້ວ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ສົ່ງຮູບແລ້ວ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ກຳລັງບັນທຶກພາບໜ້າຈໍ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ກຳລັງບັນທຶກຮູບໜ້າຈໍໃສ່ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{ເພີ່ມ # ການຄວບຄຸມແລ້ວ.}other{ເພີ່ມ # ການຄວບຄຸມແລ້ວ.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ລຶບອອກແລ້ວ"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"ເພີ່ມ <xliff:g id="APPNAME">%s</xliff:g> ບໍ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> ສາມາດເລືອກໄດ້ວ່າການຄວບຄຸມ ແລະ ເນື້ອຫາໃດຈະສະແດງຢູ່ບ່ອນນີ້."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"ລຶບການຄວບຄຸມສຳລັບ <xliff:g id="APPNAME">%s</xliff:g> ອອກບໍ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ເພີ່ມລາຍການທີ່ມັກແລ້ວ"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ເພີ່ມລາຍການທີ່ມັກແລ້ວ, ຕຳແໜ່ງ <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ແກ້ໄຂ"</string> <string name="add" msgid="81036585205287996">"ເພີ່ມ"</string> <string name="manage_users" msgid="1823875311934643849">"ຈັດການຜູ້ໃຊ້"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ການແຈ້ງເຕືອນນີ້ບໍ່ຮອງຮັບການລາກໄປໃສ່ Splitscreen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ການແຈ້ງເຕືອນນີ້ບໍ່ຮອງຮັບການລາກເພື່ອແບ່ງໜ້າຈໍ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ບໍ່ສາມາດໃຊ້ Wi‑Fi ໄດ້"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ໂໝດຄວາມສຳຄັນ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ຕັ້ງໂມງປຸກແລ້ວ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 38fe1c7aaece..326f11b5836f 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Įgalinti USB"</string> <string name="learn_more" msgid="4690632085667273811">"Sužinokite daugiau"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekrano kopija"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Išplėstinis atrakinimas išjungtas"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"išsiuntė vaizdą"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Išsaugoma ekrano kopija..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Išsaugoma ekrano kopija darbo profilyje…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Pridėtas # valdiklis.}one{Pridėtas # valdiklis.}few{Pridėti # valdikliai.}many{Pridėta # valdiklio.}other{Pridėta # valdiklių.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Pašalinta"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Pridėti „<xliff:g id="APPNAME">%s</xliff:g>“?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"„<xliff:g id="APPNAME">%s</xliff:g>“ gali pasirinkti, kuriuos valdiklius ir turinį čia rodyti."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Pašalinti „<xliff:g id="APPNAME">%s</xliff:g>“ valdiklius?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Įtraukta į mėgstamiausius"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Įtraukta į mėgstamiausius, padėtis: <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"redaguoti"</string> <string name="add" msgid="81036585205287996">"Pridėti"</string> <string name="manage_users" msgid="1823875311934643849">"Tvarkyti naudotojus"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Šio pranešimo vilkimas išskaidyto ekrano režimu nepalaikomas."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Šio pranešimo vilkimas išskaidyto ekrano režimu nepalaikomas"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"„Wi‑Fi“ ryšys nepasiekiamas"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteto režimas"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signalas nustatytas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 6b03a03e3130..d7e99d43cc78 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Iespējot USB portu"</string> <string name="learn_more" msgid="4690632085667273811">"Uzzināt vairāk"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekrānuzņēmums"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Paildzinātā atbloķēšana ir atspējota"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"nosūtīts attēls"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Notiek ekrānuzņēmuma saglabāšana..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Notiek ekrānuzņēmuma saglabāšana darba profilā…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Pievienota # vadīkla.}zero{Pievienotas # vadīklas.}one{Pievienota # vadīkla.}other{Pievienotas # vadīklas.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Noņemta"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vai pievienot lietotni <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> var izvēlēties, kuras vadīklas un saturu šeit rādīt."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vai noņemt vadīklas lietotnei <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Pievienota izlasei"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Pievienota izlasei, <xliff:g id="NUMBER">%d</xliff:g>. pozīcija"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"rediģētu"</string> <string name="add" msgid="81036585205287996">"Pievienot"</string> <string name="manage_users" msgid="1823875311934643849">"Pārvaldīt lietotājus"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Šis paziņojums neatbalsta vilkšanu uz dalīto ekrānu."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Šis paziņojums neatbalsta vilkšanu uz sadalīto ekrānu."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nav pieejams"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritātes režīms"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signāls ir iestatīts"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 940b6191f020..1948796ac0c9 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Овозможи USB"</string> <string name="learn_more" msgid="4690632085667273811">"Дознајте повеќе"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Слика од екранот"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"„Продолженото отклучување“ е оневозможено"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"испрати слика"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Сликата на екранот се зачувува..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Се зачувува слика од екранот на вашиот работен профил…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Додадена е # контрола.}one{Додадени се # контрола.}other{Додадени се # контроли.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Отстранета"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Да се додаде <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> може да избере кои контроли и содржини се прикажуваат овде."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Да се отстранат контролите за <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Омилена"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Омилена, позиција <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"измени"</string> <string name="add" msgid="81036585205287996">"Додај"</string> <string name="manage_users" msgid="1823875311934643849">"Управувајте со корисниците"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Известувањево не поддржува влечење на поделен екран."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Известувањево не поддржува влечење на поделен екран"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi е недостапна"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетен режим"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Алармот е наместен"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 2597fcd4c037..0a36380d2fee 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="learn_more" msgid="4690632085667273811">"കൂടുതലറിയുക"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"സ്ക്രീൻഷോട്ട്"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock പ്രവർത്തനരഹിതമാക്കി"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ചിത്രം അയച്ചു"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# നിയന്ത്രണം ചേർത്തു.}other{# നിയന്ത്രണങ്ങൾ ചേർത്തു.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"നീക്കം ചെയ്തു"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ചേർക്കണോ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"ഏതൊക്കെ നിയന്ത്രണങ്ങളും ഉള്ളടക്കവും ഇവിടെ ദൃശ്യമാകണമെന്ന് <xliff:g id="APPNAME">%s</xliff:g> എന്നതിന് തിരഞ്ഞെടുക്കാനാകും."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> എന്നതിനുള്ള നിയന്ത്രണങ്ങൾ നീക്കം ചെയ്യണോ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"പ്രിയപ്പെട്ടതാക്കി"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"പ്രിയപ്പെട്ടതാക്കി, സ്ഥാനം <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"എഡിറ്റ് ചെയ്യുക"</string> <string name="add" msgid="81036585205287996">"ചേർക്കുക"</string> <string name="manage_users" msgid="1823875311934643849">"ഉപയോക്താക്കളെ മാനേജ് ചെയ്യുക"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"സ്പ്ലിറ്റ് സ്ക്രീനിലേക്ക് വലിച്ചിടുന്നതിനെ ഈ അറിയിപ്പ് പിന്തുണയ്ക്കുന്നില്ല."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"സ്പ്ലിറ്റ് സ്ക്രീനിലേക്ക് വലിച്ചിടുന്നതിനെ ഈ അറിയിപ്പ് പിന്തുണയ്ക്കുന്നില്ല"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"വൈഫൈ ലഭ്യമല്ല"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"മുൻഗണനാ മോഡ്"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"അലാറം സജ്ജീകരിച്ചു"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index cd5bdfd2d555..759218a5cc50 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB-г идэвхжүүлэх"</string> <string name="learn_more" msgid="4690632085667273811">"Нэмэлт мэдээлэл авах"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Дэлгэцийн зураг дарах"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock-г идэвхгүй болгосон"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"зураг илгээсэн"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Дэлгэцийн агшинг хадгалж байна…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Дэлгэцийн агшныг ажлын профайлд хадгалж байна…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# хяналт нэмсэн.}other{# хяналт нэмсэн.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Хассан"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g>-г нэмэх үү?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> аль хяналт болон контент энд харагдахыг сонгож болно."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g>-н тохиргоог хасах уу?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Дуртай гэж тэмдэглэсэн"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"<xliff:g id="NUMBER">%d</xliff:g>-р байршилд дуртай гэж тэмдэглэсэн"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"засах"</string> <string name="add" msgid="81036585205287996">"Нэмэх"</string> <string name="manage_users" msgid="1823875311934643849">"Хэрэглэгчдийг удирдах"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Энэ мэдэгдэл нь Дэлгэцийг хуваах горим руу чирэхийг дэмждэггүй."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Энэ мэдэгдэл нь дэлгэцийг хуваах горим руу чирэхийг дэмждэггүй"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi боломжгүй"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Чухал горим"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Сэрүүлгийг тохируулсан"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index ea86faec5b95..c0605a87455d 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -145,10 +145,10 @@ <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"चेहरा ऑथेंटिकेशन केलेला आहे"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"निश्चित केले"</string> <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"पूर्ण करण्यासाठी खात्री करा वर टॅप करा"</string> - <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"चेहऱ्याने अनलॉक केले. सुरू ठेवण्यासाठी अनलॉक करा आयकन दाबा."</string> - <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"चेहऱ्याने अनलॉक केले आहे. पुढे सुरू ठेवण्यासाठी दाबा."</string> - <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी दाबा."</string> - <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन दाबा."</string> + <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"चेहऱ्याने अनलॉक केले. सुरू ठेवण्यासाठी अनलॉक करा आयकन प्रेस करा."</string> + <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"चेहऱ्याने अनलॉक केले आहे. पुढे सुरू ठेवण्यासाठी प्रेस करा."</string> + <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी प्रेस करा."</string> + <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन प्रेस करा."</string> <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ऑथेंटिकेशन केलेले"</string> <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन वापरा"</string> <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पॅटर्न वापरा"</string> @@ -335,12 +335,12 @@ <string name="notification_tap_again" msgid="4477318164947497249">"उघडण्यासाठी पुन्हा टॅप करा"</string> <string name="tap_again" msgid="1315420114387908655">"पुन्हा टॅप करा"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"उघडण्यासाठी वर स्वाइप करा"</string> - <string name="keyguard_unlock_press" msgid="9140109453735019209">"उघडण्यासाठी अनलॉक करा आयकन दाबा"</string> + <string name="keyguard_unlock_press" msgid="9140109453735019209">"उघडण्यासाठी अनलॉक करा आयकन प्रेस करा"</string> <string name="keyguard_face_successful_unlock_swipe" msgid="6180997591385846073">"चेहऱ्याने अनलॉक केले आहे. उघडण्यासाठी वर स्वाइप करा."</string> - <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"चेहऱ्याने अनलॉक केले. उघडण्यासाठी अनलॉक करा आयकन दाबा."</string> - <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"चेहऱ्याने अनलॉक केले आहे. उघडण्यासाठी दाबा."</string> - <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"चेहरा ओळखला आहे. उघडण्यासाठी दाबा."</string> - <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"चेहरा ओळखला आहे. उघडण्यासाठी अनलॉक करा आयकन दाबा."</string> + <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"चेहऱ्याने अनलॉक केले. उघडण्यासाठी अनलॉक करा आयकन प्रेस करा."</string> + <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"चेहऱ्याने अनलॉक केले आहे. उघडण्यासाठी प्रेस करा."</string> + <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"चेहरा ओळखला आहे. उघडण्यासाठी प्रेस करा."</string> + <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"चेहरा ओळखला आहे. उघडण्यासाठी अनलॉक करा आयकन प्रेस करा."</string> <string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"चेहऱ्याने अनलॉक केले आहे"</string> <string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"चेहरा ओळखला आहे"</string> <string name="keyguard_retry" msgid="886802522584053523">"पुन्हा प्रयत्न करण्यासाठी वर स्वाइप करा"</string> @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# नियंत्रण जोडले आहे.}other{# नियंत्रणे जोडली आहेत.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"काढून टाकले"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> जोडायचे आहे का?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> हे येथे कोणती नियंत्रणे आणि आशय दाखवावा ते निवडू शकते."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> साठी नियंत्रणे काढून टाकायची आहेत का?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"आवडले"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"आवडले, स्थान <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"संपादित करा"</string> <string name="add" msgid="81036585205287996">"जोडा"</string> <string name="manage_users" msgid="1823875311934643849">"वापरकर्ते व्यवस्थापित करा"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ही सूचना स्प्लिटस्क्रीनवर ड्रॅग करण्याला सपोर्ट करत नाही."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ही सूचना स्प्लिट स्क्रीनवर ड्रॅग करण्याला सपोर्ट करत नाही"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"वाय-फाय उपलब्ध नाही"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"प्राधान्य मोड"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"अलार्म सेट केला"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 11582872aca5..ce9aa402bb8c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Dayakan USB"</string> <string name="learn_more" msgid="4690632085667273811">"Ketahui lebih lanjut"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Tangkapan skrin"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Lanjutkan Buka Kunci dilumpuhkan"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"menghantar imej"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan tangkapan skrin..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Menyimpan tangkapan skrin ke profil kerja…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kawalan ditambah.}other{# kawalan ditambah.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Dialih keluar"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Tambahkan <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g>boleh memilih kawalan dan kandungan yang dipaparkan di sini."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Alih keluar kawalan untuk <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Digemari"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Digemari, kedudukan <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edit"</string> <string name="add" msgid="81036585205287996">"Tambah"</string> <string name="manage_users" msgid="1823875311934643849">"Urus pengguna"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Pemberitahuan ini tidak menyokong penyeretan ke Skrin pisah."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Pemberitahuan ini tidak menyokong penyeretan kepada skrin pisah"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi dimatikan"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mod keutamaan"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Penggera ditetapkan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index c110097b21fa..0194c772c7c6 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ကို ဖွင့်ရန်"</string> <string name="learn_more" msgid="4690632085667273811">"ပိုမိုလေ့လာရန်"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ဖန်သားပြင်ဓာတ်ပုံ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"‘တိုးချဲ့ဖွင့်ခြင်း’ ပိတ်ထားသည်"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ပုံပို့ထားသည်"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"အလုပ်ပရိုဖိုင်တွင် ဖန်သားပြင်ဓာတ်ပုံ သိမ်းနေသည်…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{ထိန်းချုပ်ခလုတ် # ခု ထည့်ထားသည်။}other{ထိန်းချုပ်ခလုတ် # ခု ထည့်ထားသည်။}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ဖယ်ရှားထားသည်"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ထည့်မလား။"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> သည် ဤနေရာတွင်ပြသည့် သတ်မှတ်ချက်နှင့် အကြောင်းအရာများကို ရွေးနိုင်သည်။"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> အတွက် သတ်မှတ်ချက်များ ဖယ်ရှားမလား။"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"အကြိုက်ဆုံးတွင် ထည့်ထားသည်"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"အကြိုက်ဆုံးတွင် ထည့်ထားသည်၊ အဆင့် <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"တည်းဖြတ်ရန်"</string> <string name="add" msgid="81036585205287996">"ထည့်ရန်"</string> <string name="manage_users" msgid="1823875311934643849">"အသုံးပြုသူများ စီမံရန်"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ဤအကြောင်းကြားချက်သည် ‘မျက်နှာပြင်ခွဲ၍ပြသမှု’ သို့ ဖိဆွဲခြင်းကို မပံ့ပိုးပါ။"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ဤအကြောင်းကြားချက်သည် ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဖိဆွဲမှုကို မပံ့ပိုးပါ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi မရပါ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ဦးစားပေးမုဒ်"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"နိုးစက် သတ်မှတ်ထားသည်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index c6a665a4ca68..f0da4e978cc9 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Slå på USB"</string> <string name="learn_more" msgid="4690632085667273811">"Finn ut mer"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjermdump"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock er slått av"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har sendt et bilde"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Lagrer skjermdumpen …"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Lagrer skjermdumpen i jobbprofilen …"</string> @@ -1067,7 +1066,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"redigere"</string> <string name="add" msgid="81036585205287996">"Legg til"</string> <string name="manage_users" msgid="1823875311934643849">"Administrer brukere"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Dette varselet støtter ikke at du drar det til en delt skjerm."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi er utilgjengelig"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteringsmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmen er stilt inn"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 621fdab8577d..c45185374fde 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB सक्षम पार्नुहोस्"</string> <string name="learn_more" msgid="4690632085667273811">"थप जान्नुहोस्"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रिनसट"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock अफ गरिएको छ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"कुनै छवि पठाइयो"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रिनसट बचत गर्दै…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"कार्य प्रोफाइलमा स्क्रिनसट सेभ गरिँदै छ…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# कन्ट्रोल हालियो।}other{# वटा कन्ट्रोल हालियो।}}"</string> <string name="controls_removed" msgid="3731789252222856959">"हटाइएको"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> हाल्ने हो?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> ले यहाँ कुन कुन कन्ट्रोल र सामग्री देखाउने भन्ने कुरा छनौट गर्न सक्छ।"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> का सेटिङ हटाउने हो?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"मनपराइएको"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"मन पराइएका कुराहरूको <xliff:g id="NUMBER">%d</xliff:g> औँ स्थानमा"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"सम्पादन गर्नुहोस्"</string> <string name="add" msgid="81036585205287996">"हाल्नुहोस्"</string> <string name="manage_users" msgid="1823875311934643849">"प्रयोगकर्ताहरूको व्यवस्थापन गर्नुहोस्"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"यो सूचना ड्र्याग गरेर स्प्लिटस्क्रिनमा लैजान मिल्दैन।"</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi उपलब्ध छैन"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"प्राथमिकता मोड"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"अलार्म सेट गरिएको छ"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 3b8a957b5fae..88faab4e97a2 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB aanzetten"</string> <string name="learn_more" msgid="4690632085667273811">"Meer informatie"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Ontgrendelen verlengen uitgezet"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"heeft een afbeelding gestuurd"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot opslaan..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Screenshot opslaan in werkprofiel…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# bedieningselement toegevoegd.}other{# bedieningselementen toegevoegd.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Verwijderd"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> toevoegen?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan kiezen welke bedieningselementen en content hier worden getoond."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Bedieningselementen voor <xliff:g id="APPNAME">%s</xliff:g> verwijderen?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Gemarkeerd als favoriet"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Gemarkeerd als favoriet, positie <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"bewerken"</string> <string name="add" msgid="81036585205287996">"Toevoegen"</string> <string name="manage_users" msgid="1823875311934643849">"Gebruikers beheren"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Deze melding biedt geen ondersteuning voor slepen naar het gesplitste scherm."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Deze melding biedt geen ondersteuning voor slepen naar het gesplitste scherm"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wifi niet beschikbaar"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteitsmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wekker gezet"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 98ae465397d0..a576ac504b06 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ସକ୍ଷମ କରନ୍ତୁ"</string> <string name="learn_more" msgid="4690632085667273811">"ଅଧିକ ଜାଣନ୍ତୁ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlockକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ଏକ ଛବି ପଠାଯାଇଛି"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ୱାର୍କ ପ୍ରୋଫାଇଲରେ ସ୍କ୍ରିନସଟ ସେଭ କରାଯାଉଛି…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{#ଟି ନିୟନ୍ତ୍ରଣ ଯୋଗ କରାଯାଇଛି।}other{#ଟି ନିୟନ୍ତ୍ରଣ ଯୋଗ କରାଯାଇଛି।}}"</string> <string name="controls_removed" msgid="3731789252222856959">"କାଢ଼ି ଦିଆଯାଇଛି"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g>କୁ ଯୋଗ କରିବେ?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"ଏଠାରେ କେଉଁ ନିୟନ୍ତ୍ରଣ ଏବଂ ବିଷୟବସ୍ତୁ ଦେଖାଯିବ ତାହା <xliff:g id="APPNAME">%s</xliff:g> ବାଛିପାରିବ।"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> ପାଇଁ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ କାଢ଼ି ଦେବେ?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ପସନ୍ଦ କରାଯାଇଛି"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ପସନ୍ଦ କରାଯାଇଛି, ସ୍ଥିତି <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ଏଡିଟ କରନ୍ତୁ"</string> <string name="add" msgid="81036585205287996">"ଯୋଗ କରନ୍ତୁ"</string> <string name="manage_users" msgid="1823875311934643849">"ଉପଯୋଗକର୍ତ୍ତାମାନଙ୍କୁ ପରିଚାଳନା କରନ୍ତୁ"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ଏହି ବିଜ୍ଞପ୍ତି ସ୍ପ୍ଲିଟସ୍କ୍ରିନକୁ ଡ୍ରାଗ କରିବାକୁ ସମର୍ଥନ କରେ ନାହିଁ।"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ଏହି ବିଜ୍ଞପ୍ତି ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ଟାଣିବାକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ପ୍ରାଥମିକତା ମୋଡ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ଆଲାରାମ ସେଟ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index ebdcd0c9af4e..acc9339f4abb 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ਚਾਲੂ ਕਰੋ"</string> <string name="learn_more" msgid="4690632085667273811">"ਹੋਰ ਜਾਣੋ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ਚਿੱਤਰ ਭੇਜਿਆ ਗਿਆ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="add" msgid="81036585205287996">"ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="manage_users" msgid="1823875311934643849">"ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ਇਹ ਸੂਚਨਾ ਸਪਲਿਟ ਸਕ੍ਰੀਨ \'ਤੇ ਘਸੀਟਣ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ।"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ਇਹ ਸੂਚਨਾ ਸਪਲਿਟ ਸਕ੍ਰੀਨ \'ਤੇ ਘਸੀਟਣ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ਵਾਈ-ਫਾਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ਤਰਜੀਹੀ ਮੋਡ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ਅਲਾਰਮ ਸੈੱਟ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 37eb6381cc69..078db24b6446 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Dodano # element sterujący.}few{Dodano # elementy sterujące.}many{Dodano # elementów sterujących.}other{Dodano # elementu sterującego.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Usunięto"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Dodać aplikację <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Aplikacja <xliff:g id="APPNAME">%s</xliff:g> może wybrać elementy sterujące i treści, które się tu pojawią."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Usunąć elementy sterujące aplikacji <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Dodano do ulubionych"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Dodano do ulubionych, pozycja <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"edytować"</string> <string name="add" msgid="81036585205287996">"Dodaj"</string> <string name="manage_users" msgid="1823875311934643849">"Zarządzaj użytkownikami"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"To powiadomienie nie obsługuje dzielenia ekranu przez przeciąganie."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Sieć Wi‑Fi niedostępna"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tryb priorytetowy"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm ustawiony"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 498428e5a429..6b78aa7f3e3f 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adicionar o app <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remover controles do app <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Adicionar"</string> <string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificação não tem suporte para ser arrastada para a tela dividida."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para a tela dividida"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi indisponível"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo de prioridade"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 59e6cc437fb4..8595ed0e95f6 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controlo adicionado.}many{# controlos adicionados.}other{# controlos adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adicionar <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"A app <xliff:g id="APPNAME">%s</xliff:g> pode escolher que controlos e conteúdos são apresentados aqui."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remover controlos para a app <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado aos favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionados aos favoritos, posição <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Adicionar"</string> <string name="manage_users" msgid="1823875311934643849">"Gerir utilizadores"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificação não pode ser arrastada para o ecrã dividido."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para o ecrã dividido"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi indisponível"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo Prioridade"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 498428e5a429..6b78aa7f3e3f 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adicionar o app <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remover controles do app <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string> <string name="add" msgid="81036585205287996">"Adicionar"</string> <string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificação não tem suporte para ser arrastada para a tela dividida."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificação não pode ser arrastada para a tela dividida"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi indisponível"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo de prioridade"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme definido"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index ae0939f2d53f..c915522ceeba 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activează USB"</string> <string name="learn_more" msgid="4690632085667273811">"Mai multe"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captură de ecran"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Funcția Extend Unlock este dezactivată"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a trimis o imagine"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Se salvează captura de ecran..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Se salvează captura în profilul de serviciu…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{S-a adăugat # comandă.}few{S-au adăugat # comenzi.}other{S-au adăugat # de comenzi.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Eliminată"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adaugi <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> poate să aleagă comenzile și conținutul care se afișează aici."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Elimini comenzile pentru <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Marcată ca preferată"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Marcată ca preferată, poziția <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"editează"</string> <string name="add" msgid="81036585205287996">"Adaugă"</string> <string name="manage_users" msgid="1823875311934643849">"Gestionează utilizatorii"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Notificarea nu acceptă tragerea pe ecranul împărțit."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Notificarea nu acceptă tragerea pe ecranul împărțit"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi indisponibil"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modul Prioritate"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmă setată"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 244bdf7c9a33..42fe05662257 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Включить USB-порт"</string> <string name="learn_more" msgid="4690632085667273811">"Подробнее"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Функция \"Отложить блокировку\" отключена"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"отправлено изображение"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Сохранение..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Сохранение скриншота в рабочем профиле…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Добавлен # элемент управления.}one{Добавлен # элемент управления.}few{Добавлено # элемента управления.}many{Добавлено # элементов управления.}other{Добавлено # элемента управления.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Удалено"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Добавить приложение \"<xliff:g id="APPNAME">%s</xliff:g>\"?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Приложение \"<xliff:g id="APPNAME">%s</xliff:g>\" может выбирать, какой контент и настройки будут здесь показываться."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Удалить приложение \"<xliff:g id="APPNAME">%s</xliff:g>\" с панели управления устройствами?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Добавлено в избранное"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Добавлено в избранное на позицию <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"изменить"</string> <string name="add" msgid="81036585205287996">"Добавить"</string> <string name="manage_users" msgid="1823875311934643849">"Управление пользователями"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Это уведомление нельзя перетаскивать между частями разделенного экрана."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Это уведомление нельзя перетаскивать между частями разделенного экрана."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Сеть Wi‑Fi недоступна"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Режим приоритета"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будильник установлен"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 61a5ce54d076..5522178ccb5d 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB සබල කරන්න"</string> <string name="learn_more" msgid="4690632085667273811">"තවත් දැන ගන්න"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"තිර රුව"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"දිගු අගුළු හැරීම අබල කර ඇත"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"රූපයක් එවන ලදී"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"තිර රුව සුරැකෙමින් පවතී…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"කාර්යාල පැතිකඩ වෙත තිර රුව සුරකිමින්…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"සංස්කරණය"</string> <string name="add" msgid="81036585205287996">"එක් කරන්න"</string> <string name="manage_users" msgid="1823875311934643849">"පරිශීලකයන් කළමනාකරණය කරන්න"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"මෙම දැනුම්දීම බෙදුම් තිරය වෙත ඇද ගෙන යාමට සහාය නොදක්වයි."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"මෙම දැනුම්දීම බෙදුම් තිරය වෙත ඇද ගෙන යාමට සහාය නොදක්වයි."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ලබා ගත නොහැකිය"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ප්රමුඛතා ප්රකාරය"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"සීනුව සකසන ලදි"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 276f51f6b584..72106896d526 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Povoliť USB"</string> <string name="learn_more" msgid="4690632085667273811">"Ďalšie informácie"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímka obrazovky"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Predĺžené odomknutie je vypnuté"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odoslal(a) obrázok"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Prebieha ukladanie snímky obrazovky..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ukladá sa snímka obrazovky do pracovného profilu…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Bol pridaný # ovládací prvok.}few{Boli pridané # ovládacie prvky.}many{# controls added.}other{Bolo pridaných # ovládacích prvkov.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Odstránené"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Chcete pridať aplikáciu <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> môže vybrať, ktoré ovládacie prvky a obsah sa tu majú zobrazovať."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Chcete odstrániť ovládanie aplikácie <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Pridané medzi obľúbené"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Pridané medzi obľúbené, pozícia <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"upraviť"</string> <string name="add" msgid="81036585205287996">"Pridať"</string> <string name="manage_users" msgid="1823875311934643849">"Spravovať používateľov"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Toto upozornenie nepodporuje presun na rozdelenú obrazovku."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Toto upozornenie nepodporuje presun na rozdelenú obrazovku"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nie je k dispozícii"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Režim priority"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Budík je nastavený"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 97362843ad87..7bdb979c3e1c 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Omogoči USB"</string> <string name="learn_more" msgid="4690632085667273811">"Več o tem"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Posnetek zaslona"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Podaljšanje časa odklenjenosti je onemogočeno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslal(-a) sliko"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Shranjevanje posnetka zaslona ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Shranjevanje posnetka zaslona v delovni profil …"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrolnik je dodan.}one{# kontrolnik je dodan.}two{# kontrolnika sta dodana.}few{# kontrolniki so dodani.}other{# kontrolnikov je dodanih.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Odstranjeno"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Želite dodati aplikacijo <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Aplikacija <xliff:g id="APPNAME">%s</xliff:g> lahko izbere, kateri kontrolniki in vsebine so prikazani tukaj."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Želite odstraniti kontrolnike za aplikacijo <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Dodano med priljubljene"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Dodano med priljubljene, položaj <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"urejanje"</string> <string name="add" msgid="81036585205287996">"Dodaj"</string> <string name="manage_users" msgid="1823875311934643849">"Upravljanje uporabnikov"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"To obvestilo ne podpira vlečenja v razdeljen zaslon."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"To obvestilo ne podpira vlečenja v razdeljen zaslon."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ni na voljo."</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prednostni način"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm je nastavljen."</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 02f9638abef5..71da15c73614 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivizo USB-në"</string> <string name="learn_more" msgid="4690632085667273811">"Mëso më shumë"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pamja e ekranit"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"\"Shkyçja e zgjeruar\" u çaktivizua"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"dërgoi një imazh"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Po ruan pamjen e ekranit…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pamja e ekranit po ruhet te profili i punës…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{U shtua # kontroll.}other{U shtuan # kontrolle.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"E hequr"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Të shtohet <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> mund të zgjedhë se cilat kontrolle dhe përmbajtje shfaqen këtu."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Të hiqen kontrollet për <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"E shtuar te të preferuarat"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"E shtuar te të preferuarat, pozicioni <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"për të modifikuar"</string> <string name="add" msgid="81036585205287996">"Shto"</string> <string name="manage_users" msgid="1823875311934643849">"Menaxho përdoruesit"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ky njoftim nuk mbështet zvarritjen në \"Ekranin e ndarë\"."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ky njoftim nuk mbështet zvarritjen tek ekrani i ndarë"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi nuk ofrohet"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modaliteti \"Me përparësi\""</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmi është caktuar"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index ed9991396077..6136c367702a 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Омогући USB"</string> <string name="learn_more" msgid="4690632085667273811">"Сазнајте више"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Снимак екрана"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Продужено откључавање је онемогућено"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"је послао/ла слику"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Чување снимка екрана..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Снимак екрана се чува на пословном профилу…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# контрола је додата.}one{# контрола је додата.}few{# контроле су додате.}other{# контрола је додато.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Уклоњено"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Желите ли да додате <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> може да одабере које контроле и садржај се приказују овде."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Желите да уклоните контроле за <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Означено је као омиљено"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Означено је као омиљено, <xliff:g id="NUMBER">%d</xliff:g>. позиција"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"измените"</string> <string name="add" msgid="81036585205287996">"Додај"</string> <string name="manage_users" msgid="1823875311934643849">"Управљаjте корисницима"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Ово обавештење не подржава превлачење на подељени екран."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Ово обавештење не подржава превлачење на подељени екран"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi није доступан"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетни режим"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Аларм је подешен"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 2809b3b1bff9..f359ae90cfda 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivera USB"</string> <string name="learn_more" msgid="4690632085667273811">"Läs mer"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skärmbild"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock har inaktiverats"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har skickat en bild"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skärmbilden sparas ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Sparar skärmbild i jobbprofilen …"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontroll har lagts till.}other{# kontroller har lagts till.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Har tagits bort"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vill du lägga till <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan välja vilka kontroller och vilket innehåll som visas här."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vill du ta bort inställningarna för <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Har lagts till som favorit"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Har lagts till som favorit, plats <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"redigera"</string> <string name="add" msgid="81036585205287996">"Lägg till"</string> <string name="manage_users" msgid="1823875311934643849">"Hantera användare"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Det går inte att dra den här aviseringen till delad skärm."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Det går inte att dra den här aviseringen till delad skärm"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wifi är inte tillgängligt"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritetsläge"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmet är aktiverat"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 056a8a88fe64..6973c89d8bb2 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Washa kipengele cha USB"</string> <string name="learn_more" msgid="4690632085667273811">"Pata maelezo zaidi"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Picha ya skrini"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Kipengele cha Kuongeza muda wa Kutofunga Skrini kimezimwa"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"imetuma picha"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Inahifadhi picha ya skrini..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Inahifadhi picha ya skrini kwenye wasifu wa kazini…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Umeweka kidhibiti #.}other{Umeweka vidhibiti #.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Kimeondolewa"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Ungependa kuweka <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> inaweza kuchagua ni vidhibiti na maudhui yapi yatakayoonekana hapa."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Ungependa kuondoa vidhibiti vya <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Kimewekwa kwenye vipendwa"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Kimewekwa kwenye vipendwa, nafasi ya <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ubadilishe"</string> <string name="add" msgid="81036585205287996">"Weka"</string> <string name="manage_users" msgid="1823875311934643849">"Dhibiti watumiaji"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Arifa hii hairuhusu kuburuta kwenye Skrini iliyogawanyika."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi haipatikani"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Hali ya kipaumbele"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Kengele imewekwa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 49ace2320bd4..e32f28ad8265 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USBயை இயக்கு"</string> <string name="learn_more" msgid="4690632085667273811">"மேலும் அறிக"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ஸ்கிரீன்ஷாட்"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"நீண்டநேர அன்லாக் அம்சம் முடக்கப்பட்டது"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"படம் அனுப்பப்பட்டது"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"பணிக் கணக்கில் ஸ்கிரீன்ஷாட் சேமிக்கப்படுகிறது…"</string> @@ -1067,7 +1066,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"திருத்தும்"</string> <string name="add" msgid="81036585205287996">"சேர்"</string> <string name="manage_users" msgid="1823875311934643849">"பயனர்களை நிர்வகித்தல்"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"பிரிக்கப்பட்ட திரைக்குள் இந்த அறிவிப்பை இழுத்துவிட முடியாது."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"வைஃபை கிடைக்கவில்லை"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"முன்னுரிமைப் பயன்முறை"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"அலாரம் அமைக்கப்பட்டுள்ளது"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 9fe3d5c50382..894298a224be 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USBని ప్రారంభించండి"</string> <string name="learn_more" msgid="4690632085667273811">"మరింత తెలుసుకోండి"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"స్క్రీన్షాట్"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"అన్లాక్ను పొడిగించడం డిజేబుల్ చేయబడింది"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ఇమేజ్ను పంపారు"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"స్క్రీన్షాట్ను వర్క్ ప్రొఫైల్కు సేవ్ చేస్తోంది…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# కంట్రోల్ జోడించబడింది.}other{# కంట్రోల్స్ జోడించబడ్డాయి.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"తీసివేయబడింది"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g>ను జోడించాలా?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> ఇక్కడ ఏ కంట్రోల్స్, కంటెంట్ కనిపించాలో ఎంచుకోగలదు."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> కోసం కంట్రోల్స్ను తీసివేయాలా?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ఇష్టమైనదిగా గుర్తు పెట్టబడింది"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"<xliff:g id="NUMBER">%d</xliff:g>వ స్థానంలో ఇష్టమైనదిగా గుర్తు పెట్టబడింది"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ఎడిట్"</string> <string name="add" msgid="81036585205287996">"జోడించండి"</string> <string name="manage_users" msgid="1823875311934643849">"యూజర్లను మేనేజ్ చేయండి"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"ఈ నోటిఫికేషన్ స్ప్లిట్స్క్రీన్కు లాగడానికి సపోర్ట్ చేయదు."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ఈ నోటిఫికేషన్ స్ప్లిట్ స్క్రీన్కు లాగడాన్ని సపోర్ట్ చేయదు"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi అందుబాటులో లేదు"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ముఖ్యమైన ఫైల్స్ మోడ్"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"అలారం సెట్ చేశాను"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 9f909a987d55..d1414024f236 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"เปิดใช้ USB"</string> <string name="learn_more" msgid="4690632085667273811">"ดูข้อมูลเพิ่มเติม"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ภาพหน้าจอ"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ปิดใช้ฟีเจอร์ขยายเวลาปลดล็อกอยู่"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ส่งรูปภาพ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"กำลังบันทึกภาพหน้าจอ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"กำลังบันทึกภาพหน้าจอไปยังโปรไฟล์งาน…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{เพิ่มตัวควบคุม # ตัวแล้ว}other{เพิ่มตัวควบคุม # ตัวแล้ว}}"</string> <string name="controls_removed" msgid="3731789252222856959">"นำออกแล้ว"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"เพิ่ม <xliff:g id="APPNAME">%s</xliff:g> ไหม"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> สามารถเลือกตัวควบคุมและเนื้อหาที่จะปรากฏขึ้นที่นี่"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"นำการควบคุมสำหรับ <xliff:g id="APPNAME">%s</xliff:g> ออกไหม"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"ตั้งเป็นรายการโปรดแล้ว"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ตั้งเป็นรายการโปรดแล้ว โดยอยู่ลำดับที่ <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -899,7 +897,7 @@ <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"ควบคุมอุปกรณ์จากหน้าจอล็อกไหม"</string> <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"คุณควบคุมอุปกรณ์บางอย่างได้โดยไม่ต้องปลดล็อกโทรศัพท์หรือแท็บเล็ต แอปจัดการอุปกรณ์จะระบุอุปกรณ์ที่สามารถควบคุมด้วยวิธีนี้ได้"</string> <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"ไม่เป็นไร"</string> - <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"มี"</string> + <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"ใช่"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN ประกอบด้วยตัวอักษรหรือสัญลักษณ์"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"ยืนยัน <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"PIN ไม่ถูกต้อง"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"แก้ไข"</string> <string name="add" msgid="81036585205287996">"เพิ่ม"</string> <string name="manage_users" msgid="1823875311934643849">"จัดการผู้ใช้"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"การแจ้งเตือนนี้ไม่รองรับการลากเพื่อแบ่งหน้าจอ"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"การแจ้งเตือนนี้ไม่รองรับการลากเพื่อแยกหน้าจอ"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ใช้ Wi‑Fi ไม่ได้"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"โหมดลำดับความสำคัญ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ตั้งปลุกแล้ว"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 6326a9770b3c..732094fd1646 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"I-enable ang USB"</string> <string name="learn_more" msgid="4690632085667273811">"Matuto pa"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Na-disable ang Extend Unlock"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"nagpadala ng larawan"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Sine-save ang screenshot…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Sine-save ang screenshot sa profile sa trabaho…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Nagdagdag ng # kontrol.}one{Nagdagdag ng # kontrol.}other{Nagdagdag ng # na kontrol.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Inalis"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Idagdag ang <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"Mapipili ng <xliff:g id="APPNAME">%s</xliff:g> kung aling mga kontrol at content ang lalabas dito."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Alisin ang mga kontrol para sa <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ginawang paborito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ginawang paborito, posisyon <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"i-edit"</string> <string name="add" msgid="81036585205287996">"Magdagdag"</string> <string name="manage_users" msgid="1823875311934643849">"Pamahalaan ang mga user"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Hindi sinusuportahan ng notification na ito ang pag-drag sa Splitscreen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Hindi sinusuportahan ng notification na ito ang pag-drag sa split screen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Hindi available ang Wi‑Fi"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Priority mode"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Nakatakda ang alarm"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 5236912da03c..3c3c0799d1c2 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB\'yi etkinleştir"</string> <string name="learn_more" msgid="4690632085667273811">"Daha fazla bilgi"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekran görüntüsü"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock devre dışı"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"bir resim gönderildi"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ekran görüntüsü kaydediliyor..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ekran görüntüsü iş profiline kaydediliyor…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"düzenleyin"</string> <string name="add" msgid="81036585205287996">"Ekle"</string> <string name="manage_users" msgid="1823875311934643849">"Kullanıcıları yönet"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Bu bildirim, bölünmüş ekrana sürüklenmeyi desteklemiyor."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Bu bildirim bölünmüş ekrana sürüklemeyi desteklemiyor"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Kablosuz kullanılamıyor"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Öncelik modu"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm kuruldu"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index b63b396535e3..eecabf4bd0c1 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Увімкнути USB"</string> <string name="learn_more" msgid="4690632085667273811">"Докладніше"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Знімок екрана"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock вимкнено"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"надіслане зображення"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Збереження знімка екрана..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Зберігання знімка екрана в робочому профілі…"</string> @@ -1067,7 +1066,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"змінити"</string> <string name="add" msgid="81036585205287996">"Додати"</string> <string name="manage_users" msgid="1823875311934643849">"Керувати користувачами"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Це сповіщення не підтримує режим розділеного екрана."</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Мережа Wi-Fi недоступна"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Режим пріоритету"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будильник установлено"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 7b98a2eb7c63..89e6930bb3d9 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# کنٹرول کو شامل کیا گیا۔}other{# کنٹرولز کو شامل کیا گیا۔}}"</string> <string name="controls_removed" msgid="3731789252222856959">"ہٹا دیا گیا"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> کو شامل کریں؟"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> انتخاب کر سکتی ہے کہ یہاں کون سے کنٹرولز اور مواد دکھایا جائے۔"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> کے کنٹرولز کو ہٹا دیں؟"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"پسند کردہ"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"پسند کردہ، پوزیشن <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"ترمیم کریں"</string> <string name="add" msgid="81036585205287996">"شامل کریں"</string> <string name="manage_users" msgid="1823875311934643849">"صارفین کا نظم کریں"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"یہ اطلاع اسپلٹ اسکرین کو گھسیٹنے کو سپورٹ نہیں کرتا ہے۔"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"یہ اطلاع اسپلٹ اسکرین پر گھسیٹنے کو سپورٹ نہیں کرتی ہے"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi دستیاب نہیں ہے"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"ترجیحی وضع"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"الارم سیٹ ہوگیا"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 15472f59a920..a701ae353b51 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -870,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# ta boshqaruv elementi kiritildi.}other{# ta boshqaruv elementi kiritildi.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Olib tashlandi"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> qoʻshilsinmi?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> bu yerda qaysi kontent va sozlamalar chiqishini tanlay oladi."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> qurilma boshqaruv panelidan olib tashlansinmi?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Saralanganlarga kiritilgan"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Saralanganlarga kiritilgan, <xliff:g id="NUMBER">%d</xliff:g>-joy"</string> @@ -1066,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"tahrir"</string> <string name="add" msgid="81036585205287996">"Kiritish"</string> <string name="manage_users" msgid="1823875311934643849">"Foydalanuvchilarni boshqarish"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Bu bildirishnoma ikkiga ajratilgan ekranda ishlamaydi."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Bu bildirishnoma ikkiga ajratilgan ekranda ishlamaydi."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi ishlamayapti"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Imtiyozli rejim"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Signal oʻrnatildi"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 9e2d4503511f..8f651b0ea5d1 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Bật USB"</string> <string name="learn_more" msgid="4690632085667273811">"Tìm hiểu thêm"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Chụp ảnh màn hình"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Đã tắt tính năng Luôn mở khoá"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"đã gửi hình ảnh"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Đang lưu ảnh chụp màn hình..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Đang lưu ảnh chụp màn hình vào hồ sơ công việc…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Đã thêm # chế độ điều khiển.}other{Đã thêm # chế độ điều khiển.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Đã xóa"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Thêm <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> có thể chọn các nút điều khiển và nội dung hiện ở đây."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Xoá chế độ cài đặt cho <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Được yêu thích"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Được yêu thích, vị trí số <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"sửa"</string> <string name="add" msgid="81036585205287996">"Thêm"</string> <string name="manage_users" msgid="1823875311934643849">"Quản lý người dùng"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Thông báo này không hỗ trợ thao tác kéo để Chia đôi màn hình."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Thông báo này không hỗ trợ thao tác kéo để chia đôi màn hình"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Không có Wi‑Fi"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Chế độ ưu tiên"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Đã đặt chuông báo"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 6b0e5d221f54..5532c296c8ea 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"启用 USB"</string> <string name="learn_more" msgid="4690632085667273811">"了解详情"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"屏幕截图"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"已停用 Extend Unlock"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"发送了一张图片"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在保存屏幕截图..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"正在将屏幕截图保存到工作资料…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{已添加 # 个控件。}other{已添加 # 个控件。}}"</string> <string name="controls_removed" msgid="3731789252222856959">"已移除"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"添加“<xliff:g id="APPNAME">%s</xliff:g>”?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"“<xliff:g id="APPNAME">%s</xliff:g>”可以选择在此处显示哪些控件和内容。"</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"移除<xliff:g id="APPNAME">%s</xliff:g>的控件?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"已收藏"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"已收藏,位置:<xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,8 @@ <string name="clipboard_edit" msgid="4500155216174011640">"修改"</string> <string name="add" msgid="81036585205287996">"添加"</string> <string name="manage_users" msgid="1823875311934643849">"管理用户"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"此通知不支持拖动到分屏中。"</string> + <!-- no translation found for drag_split_not_supported (7173481676120546121) --> + <skip /> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN 已关闭"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"优先模式"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"闹钟已设置"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index d83891f53feb..e6ece129b266 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"啟用 USB"</string> <string name="learn_more" msgid="4690632085667273811">"瞭解詳情"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"螢幕截圖"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"「延長解鎖」功能已停用"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"已傳送圖片"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在儲存螢幕擷取畫面..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"正在將螢幕截圖儲存至工作設定檔…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"編輯"</string> <string name="add" msgid="81036585205287996">"新增"</string> <string name="manage_users" msgid="1823875311934643849">"管理使用者"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"此通知無法拖曳到分割螢幕中。"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"此通知無法拖曳到分割螢幕中。"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi 已關閉"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先模式"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"已設定鬧鐘"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index f50955e1c452..7af44dc02397 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"啟用 USB 連接埠"</string> <string name="learn_more" msgid="4690632085667273811">"瞭解詳情"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"螢幕截圖"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"「延長解鎖」功能已停用"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"傳送了一張圖片"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在儲存螢幕截圖…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"正在將螢幕截圖儲存到工作資料夾…"</string> @@ -1067,7 +1066,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"編輯"</string> <string name="add" msgid="81036585205287996">"新增"</string> <string name="manage_users" msgid="1823875311934643849">"管理使用者"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"這項通知無法拖曳到分割畫面中。"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"這項通知無法拖曳到分割畫面中。"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi 已關閉"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"優先模式"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"鬧鐘設定成功"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index d3b1646352a1..5a2af599ae6d 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -69,8 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Nika amandla i-USB"</string> <string name="learn_more" msgid="4690632085667273811">"Funda kabanzi"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Isithombe-skrini"</string> - <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) --> - <skip /> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Ukwandisa Ukuvula kuvaliwe"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"uthumele isithombe"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ilondoloz umfanekiso weskrini..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ilondoloza isithombe-skrini kuphrofayela yomsebenzi…"</string> @@ -871,8 +870,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{ulawulo olu-# olwengeziwe.}one{ukulawulwa okungu-# okwengeziwe.}other{ukulawulwa okungu-# okwengeziwe.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Isusiwe"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Engeza i-<xliff:g id="APPNAME">%s</xliff:g>?"</string> - <!-- no translation found for controls_panel_authorization (7045551688535104194) --> - <skip /> + <string name="controls_panel_authorization" msgid="7045551688535104194">"I-<xliff:g id="APPNAME">%s</xliff:g> ingakhetha ukuthi yiziphi izilawuli nokuqukethwe okuboniswa lapha."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Susa izilawuli ze-<xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Kwenziwe intandokazi"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Kwenziwe intandokazi, isimo esiyi-<xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1067,7 +1065,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"hlela"</string> <string name="add" msgid="81036585205287996">"Faka"</string> <string name="manage_users" msgid="1823875311934643849">"Phatha abasebenzisi"</string> - <string name="drag_split_not_supported" msgid="4326847447699729722">"Lesi saziso asikusekeli ukuhudulela ku-Splitscreen."</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Lesi saziso asikusekeli ukuhudulela ekuhlukaniseni isikrini."</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"I-Wi-Fi ayitholakali"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Imodi ebalulekile"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"I-alamu isethiwe"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 31071ca28a75..96e6d4e1a234 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -162,7 +162,6 @@ <!-- Window magnification colors --> <color name="magnification_border_color">#F29900</color> - <color name="magnification_switch_button_color">#7F000000</color> <color name="magnification_drag_corner_background">#E5FFFFFF</color> <color name="magnification_drag_handle_stroke">#000000</color> <color name="magnification_drag_handle_background_change">#111111</color> @@ -206,6 +205,7 @@ <color name="control_thumbnail_tint">#33000000</color> <color name="control_thumbnail_shadow_color">@*android:color/black</color> <color name="controls_task_view_bg">#CC191C1D</color> + <color name="control_popup_dim">#8A000000</color> <!-- Keyboard backlight indicator--> <color name="backlight_indicator_step_filled">#F6E388</color> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 412e70f0df06..249fc8664c7e 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1175,6 +1175,8 @@ <dimen name="magnification_setting_image_button_padding_horizontal">24dp</dimen> <dimen name="magnification_setting_image_button_open_in_full_padding_vertical">16dp</dimen> <dimen name="magnification_setting_image_button_open_in_full_padding_horizontal">28dp</dimen> + <dimen name="magnification_setting_drag_corner_radius">28dp</dimen> + <dimen name="magnification_setting_drag_size">56dp</dimen> <!-- Seekbar with icon buttons --> <dimen name="seekbar_icon_size">24dp</dimen> @@ -1200,6 +1202,13 @@ <dimen name="control_menu_item_min_height">56dp</dimen> <dimen name="control_menu_vertical_padding">12dp</dimen> <dimen name="control_menu_horizontal_padding">16dp</dimen> + <dimen name="control_popup_item_corner_radius">4dp</dimen> + <dimen name="control_popup_item_height">56dp</dimen> + <dimen name="control_popup_item_padding">16dp</dimen> + <dimen name="control_popup_items_divider_height">1dp</dimen> + <dimen name="control_popup_max_width">380dp</dimen> + <dimen name="control_popup_corner_radius">28dp</dimen> + <dimen name="control_popup_horizontal_margin">16dp</dimen> <dimen name="control_spinner_padding_vertical">24dp</dimen> <dimen name="control_spinner_padding_horizontal">20dp</dimen> <dimen name="control_text_size">14sp</dimen> @@ -1405,10 +1414,6 @@ --> <dimen name="split_shade_scrim_transition_distance">300dp</dimen> - <!-- Alpha in duration in ms for the auth ripple to become fully vislble. If set to 0, - it is immediately visible. --> - <integer name="auth_ripple_alpha_in_duration">100</integer> - <dimen name="people_space_widget_radius">28dp</dimen> <dimen name="people_space_image_radius">20dp</dimen> <dimen name="people_space_messages_count_radius">12dp</dimen> @@ -1633,7 +1638,6 @@ <dimen name="dream_overlay_bottom_affordance_radius">32dp</dimen> <dimen name="dream_overlay_bottom_affordance_padding">14dp</dimen> <dimen name="dream_overlay_complication_clock_time_text_size">86dp</dimen> - <dimen name="dream_overlay_complication_clock_time_translation_y">28dp</dimen> <dimen name="dream_overlay_complication_clock_subtitle_text_size">24sp</dimen> <dimen name="dream_overlay_complication_preview_text_size">36sp</dimen> <dimen name="dream_overlay_complication_preview_icon_padding">28dp</dimen> @@ -1674,11 +1678,11 @@ .2 </item> - <!-- The margins applied to the dream overlay container --> - <dimen name="dream_overlay_container_margin_start">0dp</dimen> - <dimen name="dream_overlay_container_margin_end">0dp</dimen> - <dimen name="dream_overlay_container_margin_top">0dp</dimen> - <dimen name="dream_overlay_container_margin_bottom">0dp</dimen> + <!-- The padding applied to the dream overlay container --> + <dimen name="dream_overlay_container_padding_start">0dp</dimen> + <dimen name="dream_overlay_container_padding_end">0dp</dimen> + <dimen name="dream_overlay_container_padding_top">0dp</dimen> + <dimen name="dream_overlay_container_padding_bottom">0dp</dimen> <!-- The margin applied between complications --> <dimen name="dream_overlay_complication_margin">0dp</dimen> @@ -1734,6 +1738,7 @@ <dimen name="dream_overlay_clock_ambient_text_shadow_dx">0dp</dimen> <dimen name="dream_overlay_clock_ambient_text_shadow_dy">0dp</dimen> <dimen name="dream_overlay_clock_ambient_text_shadow_radius">1dp</dimen> + <dimen name="dream_overlay_clock_text_descent_extra_padding">1dp</dimen> <!-- Shadow for dream overlay status bar complications --> <dimen name="dream_overlay_status_bar_key_text_shadow_dx">0.5dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 2aa912ce250d..e7be6fc80d1c 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2335,8 +2335,6 @@ <string name="magnification_mode_switch_state_full_screen">Magnify full screen</string> <!-- A11y state description for magnification mode switch that device is in window mode. [CHAR LIMIT=NONE] --> <string name="magnification_mode_switch_state_window">Magnify part of screen</string> - <!-- Click action label for magnification switch. [CHAR LIMIT=NONE] --> - <string name="magnification_mode_switch_click_label">Switch</string> <!-- Click action label for magnification settings panel. [CHAR LIMIT=NONE] --> <string name="magnification_open_settings_click_label">Open magnification settings</string> <!-- Label of the corner of a rectangle that you can tap and drag to resize the magnification area. [CHAR LIMIT=NONE] --> @@ -2372,6 +2370,8 @@ <string name="accessibility_magnification_small">Small</string> <!-- Click action label for magnification panel large size [CHAR LIMIT=NONE]--> <string name="accessibility_magnification_large">Large</string> + <!-- Click action label for magnification panel full screen size [CHAR LIMIT=NONE]--> + <string name="accessibility_magnification_fullscreen">Full screen</string> <!-- Click action label for magnification panel Done [CHAR LIMIT=20]--> <string name="accessibility_magnification_done">Done</string> <!-- Click action label for edit magnification size [CHAR LIMIT=20]--> diff --git a/packages/SystemUI/shared/res/values/attrs.xml b/packages/SystemUI/shared/res/values/attrs.xml index f3aeaef4cfe7..84ea6b7eecf4 100644 --- a/packages/SystemUI/shared/res/values/attrs.xml +++ b/packages/SystemUI/shared/res/values/attrs.xml @@ -40,6 +40,9 @@ <attr name="ambientShadowOffsetX" /> <attr name="ambientShadowOffsetY" /> <attr name="ambientShadowAlpha" /> + <attr name="removeTextDescent" format="boolean" /> + <!-- padding to add back when removing text descent so it ensures text is not clipped --> + <attr name="textDescentExtraPadding" format="dimension" /> </declare-styleable> <declare-styleable name="DoubleShadowTextView"> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/shadow/DoubleShadowTextClock.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/shadow/DoubleShadowTextClock.kt index f2db129120e9..5a6f1840bc95 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/shadow/DoubleShadowTextClock.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/shadow/DoubleShadowTextClock.kt @@ -22,6 +22,7 @@ import android.widget.TextClock import com.android.systemui.shared.R import com.android.systemui.shared.shadow.DoubleShadowTextHelper.ShadowInfo import com.android.systemui.shared.shadow.DoubleShadowTextHelper.applyShadows +import kotlin.math.floor /** Extension of [TextClock] which draws two shadows on the text (ambient and key shadows) */ class DoubleShadowTextClock @@ -89,6 +90,21 @@ constructor( ambientShadowOffsetY.toFloat(), ambientShadowAlpha ) + val removeTextDescent = + attributes.getBoolean(R.styleable.DoubleShadowTextClock_removeTextDescent, false) + val textDescentExtraPadding = + attributes.getDimensionPixelSize( + R.styleable.DoubleShadowTextClock_textDescentExtraPadding, + 0 + ) + if (removeTextDescent) { + setPaddingRelative( + 0, + 0, + 0, + textDescentExtraPadding - floor(paint.fontMetrics.descent.toDouble()).toInt() + ) + } } finally { attributes.recycle() } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 13513148b248..6c59a941d4ce 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -122,6 +122,8 @@ public class QuickStepContract { // Whether the screen is currently transitioning into the state indicated by // SYSUI_STATE_SCREEN_ON. public static final int SYSUI_STATE_SCREEN_TRANSITION = 1 << 29; + // The notification panel expansion fraction is > 0 + public static final int SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE = 1 << 30; // Mask for SystemUiStateFlags to isolate SYSUI_STATE_SCREEN_ON and // SYSUI_STATE_SCREEN_TRANSITION, to match SCREEN_STATE_* diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 7b781cef6717..cdaed878cc3c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -110,7 +110,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private final ContentObserver mShowWeatherObserver = new ContentObserver(null) { @Override public void onChange(boolean change) { - setWeatherVisibility(); + setDateWeatherVisibility(); } }; @@ -236,7 +236,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS ); updateDoubleLineClock(); - setWeatherVisibility(); + setDateWeatherVisibility(); mKeyguardUnlockAnimationController.addKeyguardUnlockAnimationListener( mKeyguardUnlockAnimationListener); @@ -337,6 +337,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS } mCurrentClockSize = clockSize; + setDateWeatherVisibility(); ClockController clock = getClock(); boolean appeared = mView.switchToClock(clockSize, animate); @@ -457,6 +458,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mClockEventController.setClock(clock); mView.setClock(clock, mStatusBarStateController.getState()); + setDateWeatherVisibility(); } @Nullable @@ -478,11 +480,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS } } - private void setWeatherVisibility() { - if (mWeatherView != null) { - mUiExecutor.execute( - () -> mWeatherView.setVisibility( - mSmartspaceController.isWeatherEnabled() ? View.VISIBLE : View.GONE)); + private void setDateWeatherVisibility() { + if (mDateWeatherView != null || mWeatherView != null) { + mUiExecutor.execute(() -> { + if (mDateWeatherView != null) { + mDateWeatherView.setVisibility( + clockHasCustomWeatherDataDisplay() ? View.GONE : View.VISIBLE); + } + if (mWeatherView != null) { + mWeatherView.setVisibility( + mSmartspaceController.isWeatherEnabled() ? View.VISIBLE : View.GONE); + } + }); } } @@ -511,6 +520,17 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS } } + /** Returns true if the clock handles the display of weather information */ + private boolean clockHasCustomWeatherDataDisplay() { + ClockController clock = getClock(); + if (clock == null) { + return false; + } + + return ((mCurrentClockSize == LARGE) ? clock.getLargeClock() : clock.getSmallClock()) + .getEvents().getHasCustomWeatherDataDisplay(); + } + /** Gets the animations for the current clock. */ @Nullable public ClockAnimations getClockAnimations() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 085f202861bb..1de3ddd7c1dd 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -3036,10 +3036,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab .setUserId(userId) .build()); } else { - mLogger.v("startListeningForFingerprint - authenticate"); + mLogger.v("startListeningForFingerprint"); mFpm.authenticate(null /* crypto */, mFingerprintCancelSignal, - mFingerprintAuthenticationCallback, null /* handler */, - FingerprintManager.SENSOR_ID_ANY, userId, 0 /* flags */); + mFingerprintAuthenticationCallback, + null /* handler */, + new FingerprintAuthenticateOptions.Builder() + .setUserId(userId) + .build() + ); } setFingerprintRunningState(BIOMETRIC_STATE_RUNNING); } diff --git a/packages/SystemUI/src/com/android/systemui/ChooserPinMigration.kt b/packages/SystemUI/src/com/android/systemui/ChooserPinMigration.kt new file mode 100644 index 000000000000..2f03259766c0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/ChooserPinMigration.kt @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui + +import android.content.ComponentName +import android.content.Context +import android.content.Context.MODE_PRIVATE +import android.content.Intent +import android.content.SharedPreferences +import android.os.Bundle +import android.os.Environment +import android.os.storage.StorageManager +import android.util.Log +import androidx.core.util.Supplier +import com.android.internal.R +import com.android.systemui.broadcast.BroadcastSender +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags +import java.io.File +import javax.inject.Inject + +/** + * Performs a migration of pinned targets to the unbundled chooser if legacy data exists. + * + * Sends an explicit broadcast with the contents of the legacy pin preferences. The broadcast is + * protected by the RECEIVE_CHOOSER_PIN_MIGRATION permission. This class requires the + * ADD_CHOOSER_PINS permission in order to be able to send this broadcast. + */ +class ChooserPinMigration +@Inject +constructor( + private val context: Context, + private val featureFlags: FeatureFlags, + private val broadcastSender: BroadcastSender, + legacyPinPrefsFileSupplier: LegacyPinPrefsFileSupplier, +) : CoreStartable { + + private val legacyPinPrefsFile = legacyPinPrefsFileSupplier.get() + private val chooserComponent = + ComponentName.unflattenFromString( + context.resources.getString(R.string.config_chooserActivity) + ) + + override fun start() { + if (migrationIsRequired()) { + doMigration() + } + } + + private fun migrationIsRequired(): Boolean { + return featureFlags.isEnabled(Flags.CHOOSER_MIGRATION_ENABLED) && + legacyPinPrefsFile.exists() && + chooserComponent?.packageName != null + } + + private fun doMigration() { + Log.i(TAG, "Beginning migration") + + val legacyPinPrefs = context.getSharedPreferences(legacyPinPrefsFile, MODE_PRIVATE) + + if (legacyPinPrefs.all.isEmpty()) { + Log.i(TAG, "No data to migrate, deleting legacy file") + } else { + sendSharedPreferences(legacyPinPrefs) + Log.i(TAG, "Legacy data sent, deleting legacy preferences") + + val legacyPinPrefsEditor = legacyPinPrefs.edit() + legacyPinPrefsEditor.clear() + if (!legacyPinPrefsEditor.commit()) { + Log.e(TAG, "Failed to delete legacy preferences") + return + } + } + + if (!legacyPinPrefsFile.delete()) { + Log.e(TAG, "Legacy preferences deleted, but failed to delete legacy preferences file") + return + } + + Log.i(TAG, "Legacy preference deletion complete") + } + + private fun sendSharedPreferences(sharedPreferences: SharedPreferences) { + val bundle = Bundle() + + sharedPreferences.all.entries.forEach { (key, value) -> + when (value) { + is Boolean -> bundle.putBoolean(key, value) + else -> Log.e(TAG, "Unsupported preference type for $key: ${value?.javaClass}") + } + } + + sendBundle(bundle) + } + + private fun sendBundle(bundle: Bundle) { + val intent = + Intent().apply { + `package` = chooserComponent?.packageName!! + action = BROADCAST_ACTION + putExtras(bundle) + } + broadcastSender.sendBroadcast(intent, BROADCAST_PERMISSION) + } + + companion object { + private const val TAG = "PinnedShareTargetMigration" + private const val BROADCAST_ACTION = "android.intent.action.CHOOSER_PIN_MIGRATION" + private const val BROADCAST_PERMISSION = "android.permission.RECEIVE_CHOOSER_PIN_MIGRATION" + + class LegacyPinPrefsFileSupplier @Inject constructor(private val context: Context) : + Supplier<File> { + + override fun get(): File { + val packageDirectory = + Environment.getDataUserCePackageDirectory( + StorageManager.UUID_PRIVATE_INTERNAL, + context.userId, + context.packageName, + ) + val sharedPrefsDirectory = File(packageDirectory, "shared_prefs") + return File(sharedPrefsDirectory, "chooser_pin_settings.xml") + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index 59a5b1534990..f817c3cb90a7 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -77,7 +77,7 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL private final SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; private int mMagnificationMode = ACCESSIBILITY_MAGNIFICATION_MODE_NONE; private final LayoutParams mParams; - private final SwitchListener mSwitchListener; + private final ClickListener mClickListener; private final Configuration mConfiguration; @VisibleForTesting final Rect mDraggableWindowBounds = new Rect(); @@ -86,30 +86,28 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL private boolean mSingleTapDetected = false; private boolean mToLeftScreenEdge = false; - public interface SwitchListener { + public interface ClickListener { /** * Called when the switch is clicked to change the magnification mode. * @param displayId the display id of the display to which the view's window has been * attached - * @param magnificationMode the magnification mode */ - void onSwitch(int displayId, int magnificationMode); + void onClick(int displayId); } - MagnificationModeSwitch(@UiContext Context context, - SwitchListener switchListener) { - this(context, createView(context), new SfVsyncFrameCallbackProvider(), switchListener); + MagnificationModeSwitch(@UiContext Context context, ClickListener clickListener) { + this(context, createView(context), new SfVsyncFrameCallbackProvider(), clickListener); } @VisibleForTesting MagnificationModeSwitch(Context context, @NonNull ImageView imageView, - SfVsyncFrameCallbackProvider sfVsyncFrameProvider, SwitchListener switchListener) { + SfVsyncFrameCallbackProvider sfVsyncFrameProvider, ClickListener clickListener) { mContext = context; mConfiguration = new Configuration(context.getResources().getConfiguration()); mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mWindowManager = mContext.getSystemService(WindowManager.class); mSfVsyncFrameProvider = sfVsyncFrameProvider; - mSwitchListener = switchListener; + mClickListener = clickListener; mParams = createLayoutParams(context); mImageView = imageView; mImageView.setOnTouchListener(this::onTouch); @@ -122,7 +120,7 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL R.string.magnification_mode_switch_description)); final AccessibilityAction clickAction = new AccessibilityAction( AccessibilityAction.ACTION_CLICK.getId(), mContext.getResources().getString( - R.string.magnification_mode_switch_click_label)); + R.string.magnification_open_settings_click_label)); info.addAction(clickAction); info.setClickable(true); info.addAction(new AccessibilityAction(R.id.accessibility_action_move_up, @@ -396,22 +394,14 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL } } - private void toggleMagnificationMode() { - final int newMode = - mMagnificationMode ^ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; - mMagnificationMode = newMode; - mImageView.setImageResource(getIconResId(newMode)); - mSwitchListener.onSwitch(mContext.getDisplayId(), newMode); - } - private void handleSingleTap() { removeButton(); - toggleMagnificationMode(); + mClickListener.onClick(mContext.getDisplayId()); } private static ImageView createView(Context context) { ImageView imageView = new ImageView(context); - imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); imageView.setClickable(true); imageView.setFocusable(true); imageView.setAlpha(0f); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java new file mode 100644 index 000000000000..b6ee4cbc7641 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.accessibility; + +import static com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize; + +import android.annotation.NonNull; +import android.annotation.UiContext; +import android.content.ComponentCallbacks; +import android.content.Context; +import android.content.res.Configuration; +import android.util.Range; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.graphics.SfVsyncFrameCallbackProvider; +import com.android.systemui.util.settings.SecureSettings; + +/** + * A class to control {@link WindowMagnificationSettings} and receive settings panel callbacks by + * {@link WindowMagnificationSettingsCallback}. + * The settings panel callbacks will be delegated through + * {@link MagnificationSettingsController.Callback} to {@link WindowMagnification}. + */ + +public class MagnificationSettingsController implements ComponentCallbacks { + + // It should be consistent with the value defined in WindowMagnificationGestureHandler. + private static final Range<Float> A11Y_ACTION_SCALE_RANGE = new Range<>(1.0f, 8.0f); + + private final Context mContext; + + private final int mDisplayId; + + @NonNull + private final Callback mSettingsControllerCallback; + + // Window Magnification Setting view + private WindowMagnificationSettings mWindowMagnificationSettings; + + private final Configuration mConfiguration; + + MagnificationSettingsController( + @UiContext Context context, + SfVsyncFrameCallbackProvider sfVsyncFrameProvider, + @NonNull Callback settingsControllerCallback, + SecureSettings secureSettings) { + this(context, sfVsyncFrameProvider, settingsControllerCallback, secureSettings, null); + } + + @VisibleForTesting + MagnificationSettingsController( + @UiContext Context context, + SfVsyncFrameCallbackProvider sfVsyncFrameProvider, + @NonNull Callback settingsControllerCallback, + SecureSettings secureSettings, + WindowMagnificationSettings windowMagnificationSettings) { + mContext = context; + mDisplayId = mContext.getDisplayId(); + mConfiguration = new Configuration(context.getResources().getConfiguration()); + mSettingsControllerCallback = settingsControllerCallback; + if (windowMagnificationSettings != null) { + mWindowMagnificationSettings = windowMagnificationSettings; + } else { + mWindowMagnificationSettings = new WindowMagnificationSettings(context, + mWindowMagnificationSettingsCallback, + sfVsyncFrameProvider, secureSettings); + } + } + + /** + * Shows magnification settings panel {@link WindowMagnificationSettings}. The panel ui would be + * various for different magnification mode. + * + * @param mode The magnification mode + * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW + * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN + */ + void showMagnificationSettings(int mode) { + if (!mWindowMagnificationSettings.isSettingPanelShowing()) { + onConfigurationChanged(mContext.getResources().getConfiguration()); + mContext.registerComponentCallbacks(this); + } + mWindowMagnificationSettings.showSettingPanel(mode); + } + + void closeMagnificationSettings() { + mContext.unregisterComponentCallbacks(this); + mWindowMagnificationSettings.hideSettingPanel(); + } + + boolean isMagnificationSettingsShowing() { + return mWindowMagnificationSettings.isSettingPanelShowing(); + } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + final int configDiff = newConfig.diff(mConfiguration); + mConfiguration.setTo(newConfig); + onConfigurationChanged(configDiff); + } + + @VisibleForTesting + void onConfigurationChanged(int configDiff) { + mWindowMagnificationSettings.onConfigurationChanged(configDiff); + } + + @Override + public void onLowMemory() { + + } + + interface Callback { + + /** + * Called when change magnification size. + * + * @param displayId The logical display id. + * @param index Magnification size index. + * 0 : MagnificationSize.NONE, + * 1 : MagnificationSize.SMALL, + * 2 : MagnificationSize.MEDIUM, + * 3 : MagnificationSize.LARGE, + * 4 : MagnificationSize.FULLSCREEN + */ + void onSetMagnifierSize(int displayId, @MagnificationSize int index); + + /** + * Called when set allow diagonal scrolling. + * + * @param displayId The logical display id. + * @param enable Allow diagonal scrolling enable value. + */ + void onSetDiagonalScrolling(int displayId, boolean enable); + + /** + * Called when change magnification size on free mode. + * + * @param displayId The logical display id. + * @param enable Free mode enable value. + */ + void onEditMagnifierSizeMode(int displayId, boolean enable); + + /** + * Called when set magnification scale. + * + * @param displayId The logical display id. + * @param scale Magnification scale value. + */ + void onMagnifierScale(int displayId, float scale); + + /** + * Called when magnification mode changed. + * + * @param displayId The logical display id. + * @param newMode Magnification mode + * 1 : ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, + * 2 : ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW + */ + void onModeSwitch(int displayId, int newMode); + + /** + * Called when the visibility of the magnification settings panel changed. + * + * @param displayId The logical display id. + * @param shown The visibility of the magnification settings panel. + */ + void onSettingsPanelVisibilityChanged(int displayId, boolean shown); + } + + @VisibleForTesting + final WindowMagnificationSettingsCallback mWindowMagnificationSettingsCallback = + new WindowMagnificationSettingsCallback() { + @Override + public void onSetDiagonalScrolling(boolean enable) { + mSettingsControllerCallback.onSetDiagonalScrolling(mDisplayId, enable); + } + + @Override + public void onModeSwitch(int newMode) { + mSettingsControllerCallback.onModeSwitch(mDisplayId, newMode); + } + + @Override + public void onSettingsPanelVisibilityChanged(boolean shown) { + mSettingsControllerCallback.onSettingsPanelVisibilityChanged(mDisplayId, shown); + } + + @Override + public void onSetMagnifierSize(@MagnificationSize int index) { + mSettingsControllerCallback.onSetMagnifierSize(mDisplayId, index); + } + + @Override + public void onEditMagnifierSizeMode(boolean enable) { + mSettingsControllerCallback.onEditMagnifierSizeMode(mDisplayId, enable); + } + + @Override + public void onMagnifierScale(float scale) { + mSettingsControllerCallback.onMagnifierScale(mDisplayId, + A11Y_ACTION_SCALE_RANGE.clamp(scale)); + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java b/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java index 0cc1b2d92e00..63f9cc2c1b53 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java @@ -18,7 +18,7 @@ package com.android.systemui.accessibility; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; -import static com.android.systemui.accessibility.MagnificationModeSwitch.SwitchListener; +import static com.android.systemui.accessibility.MagnificationModeSwitch.ClickListener; import android.annotation.MainThread; import android.content.Context; @@ -37,19 +37,18 @@ import javax.inject.Inject; * <li> Both full-screen and window magnification mode are capable.</li> * <li> The magnification scale is changed by a user.</li> * <ol> - * The switch action will be handled by {@link #mSwitchListenerDelegate} which informs the system - * server about the changed mode. + * The click action will be handled by {@link #mClickListenerDelegate} which opens the + * {@link WindowMagnificationSettings} panel. */ @SysUISingleton -public class ModeSwitchesController implements SwitchListener { +public class ModeSwitchesController implements ClickListener { private final DisplayIdIndexSupplier<MagnificationModeSwitch> mSwitchSupplier; - private SwitchListener mSwitchListenerDelegate; + private ClickListener mClickListenerDelegate; @Inject - public ModeSwitchesController(Context context) { - mSwitchSupplier = new SwitchSupplier(context, - context.getSystemService(DisplayManager.class), this::onSwitch); + public ModeSwitchesController(Context context, DisplayManager displayManager) { + mSwitchSupplier = new SwitchSupplier(context, displayManager, this::onClick); } @VisibleForTesting @@ -102,40 +101,40 @@ public class ModeSwitchesController implements SwitchListener { } @Override - public void onSwitch(int displayId, int magnificationMode) { - if (mSwitchListenerDelegate != null) { - mSwitchListenerDelegate.onSwitch(displayId, magnificationMode); + public void onClick(int displayId) { + if (mClickListenerDelegate != null) { + mClickListenerDelegate.onClick(displayId); } } - public void setSwitchListenerDelegate(SwitchListener switchListenerDelegate) { - mSwitchListenerDelegate = switchListenerDelegate; + public void setClickListenerDelegate(ClickListener clickListenerDelegate) { + mClickListenerDelegate = clickListenerDelegate; } private static class SwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> { private final Context mContext; - private final SwitchListener mSwitchListener; + private final ClickListener mClickListener; /** * Supplies the switch for the given display. * * @param context Context * @param displayManager DisplayManager - * @param switchListener The callback that will run when the switch is clicked + * @param clickListener The callback that will run when the switch is clicked */ SwitchSupplier(Context context, DisplayManager displayManager, - SwitchListener switchListener) { + ClickListener clickListener) { super(displayManager); mContext = context; - mSwitchListener = switchListener; + mClickListener = clickListener; } @Override protected MagnificationModeSwitch createInstance(Display display) { final Context uiContext = mContext.createWindowContext(display, TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, /* options */ null); - return new MagnificationModeSwitch(uiContext, mSwitchListener); + return new MagnificationModeSwitch(uiContext, mClickListener); } } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index 3653bc80e8ad..1c030da99e15 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -16,6 +16,8 @@ package com.android.systemui.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_MAGNIFICATION_OVERLAP; @@ -55,8 +57,7 @@ import javax.inject.Inject; * when {@code IStatusBar#requestWindowMagnificationConnection(boolean)} is called. */ @SysUISingleton -public class WindowMagnification implements CoreStartable, WindowMagnifierCallback, - CommandQueue.Callbacks { +public class WindowMagnification implements CoreStartable, CommandQueue.Callbacks { private static final String TAG = "WindowMagnification"; private final ModeSwitchesController mModeSwitchesController; @@ -113,11 +114,45 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba @VisibleForTesting DisplayIdIndexSupplier<WindowMagnificationController> mMagnificationControllerSupplier; + private static class SettingsSupplier extends + DisplayIdIndexSupplier<MagnificationSettingsController> { + + private final Context mContext; + private final MagnificationSettingsController.Callback mSettingsControllerCallback; + private final SecureSettings mSecureSettings; + + SettingsSupplier(Context context, + MagnificationSettingsController.Callback settingsControllerCallback, + DisplayManager displayManager, + SecureSettings secureSettings) { + super(displayManager); + mContext = context; + mSettingsControllerCallback = settingsControllerCallback; + mSecureSettings = secureSettings; + } + + @Override + protected MagnificationSettingsController createInstance(Display display) { + final Context windowContext = mContext.createWindowContext(display, + TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, /* options */ null); + windowContext.setTheme(com.android.systemui.R.style.Theme_SystemUI); + return new MagnificationSettingsController( + windowContext, + new SfVsyncFrameCallbackProvider(), + mSettingsControllerCallback, + mSecureSettings); + } + } + + @VisibleForTesting + DisplayIdIndexSupplier<MagnificationSettingsController> mMagnificationSettingsSupplier; + @Inject public WindowMagnification(Context context, @Main Handler mainHandler, CommandQueue commandQueue, ModeSwitchesController modeSwitchesController, SysUiState sysUiState, OverviewProxyService overviewProxyService, - SecureSettings secureSettings, DisplayTracker displayTracker) { + SecureSettings secureSettings, DisplayTracker displayTracker, + DisplayManager displayManager) { mContext = context; mHandler = mainHandler; mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); @@ -127,8 +162,16 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba mOverviewProxyService = overviewProxyService; mDisplayTracker = displayTracker; mMagnificationControllerSupplier = new ControllerSupplier(context, - mHandler, this, context.getSystemService(DisplayManager.class), sysUiState, - secureSettings); + mHandler, mWindowMagnifierCallback, + displayManager, sysUiState, secureSettings); + mMagnificationSettingsSupplier = new SettingsSupplier(context, + mMagnificationSettingsControllerCallback, displayManager, secureSettings); + + mModeSwitchesController.setClickListenerDelegate( + displayId -> mHandler.post(() -> { + showMagnificationSettingsPanel(displayId, + ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + })); } @Override @@ -209,45 +252,181 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba } } - @Override - public void onWindowMagnifierBoundsChanged(int displayId, Rect frame) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onWindowMagnifierBoundsChanged(displayId, frame); + @MainThread + void showMagnificationSettingsPanel(int displayId, int mode) { + final MagnificationSettingsController magnificationSettingsController = + mMagnificationSettingsSupplier.get(displayId); + if (magnificationSettingsController != null) { + magnificationSettingsController.showMagnificationSettings(mode); } } - @Override - public void onSourceBoundsChanged(int displayId, Rect sourceBounds) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onSourceBoundsChanged(displayId, sourceBounds); + @MainThread + void hideMagnificationSettingsPanel(int displayId) { + final MagnificationSettingsController magnificationSettingsController = + mMagnificationSettingsSupplier.get(displayId); + if (magnificationSettingsController != null) { + magnificationSettingsController.closeMagnificationSettings(); } } - @Override - public void onPerformScaleAction(int displayId, float scale) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onPerformScaleAction(displayId, scale); + boolean isMagnificationSettingsPanelShowing(int displayId) { + final MagnificationSettingsController magnificationSettingsController = + mMagnificationSettingsSupplier.get(displayId); + if (magnificationSettingsController != null) { + return magnificationSettingsController.isMagnificationSettingsShowing(); } + return false; } - @Override - public void onAccessibilityActionPerformed(int displayId) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onAccessibilityActionPerformed(displayId); + @MainThread + void showMagnificationButton(int displayId, int magnificationMode) { + // not to show mode switch button if settings panel is already showing to + // prevent settings panel be covered by the button. + if (isMagnificationSettingsPanelShowing(displayId)) { + return; } + mModeSwitchesController.showButton(displayId, magnificationMode); } - @Override - public void onMove(int displayId) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onMove(displayId); + @MainThread + void removeMagnificationButton(int displayId) { + mModeSwitchesController.removeButton(displayId); + } + + @VisibleForTesting + final WindowMagnifierCallback mWindowMagnifierCallback = new WindowMagnifierCallback() { + @Override + public void onWindowMagnifierBoundsChanged(int displayId, Rect frame) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onWindowMagnifierBoundsChanged(displayId, frame); + } + } + + @Override + public void onSourceBoundsChanged(int displayId, Rect sourceBounds) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onSourceBoundsChanged(displayId, sourceBounds); + } + } + + @Override + public void onPerformScaleAction(int displayId, float scale) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onPerformScaleAction(displayId, scale); + } + } + + @Override + public void onAccessibilityActionPerformed(int displayId) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onAccessibilityActionPerformed(displayId); + } + } + + @Override + public void onMove(int displayId) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onMove(displayId); + } + } + + @Override + public void onClickSettingsButton(int displayId) { + mHandler.post(() -> { + showMagnificationSettingsPanel(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + }); + } + }; + + @VisibleForTesting + final MagnificationSettingsController.Callback mMagnificationSettingsControllerCallback = + new MagnificationSettingsController.Callback() { + @Override + public void onSetMagnifierSize(int displayId, int index) { + mHandler.post(() -> onSetMagnifierSizeInternal(displayId, index)); + } + + @Override + public void onSetDiagonalScrolling(int displayId, boolean enable) { + mHandler.post(() -> onSetDiagonalScrollingInternal(displayId, enable)); + } + + @Override + public void onEditMagnifierSizeMode(int displayId, boolean enable) { + mHandler.post(() -> onEditMagnifierSizeModeInternal(displayId, enable)); + } + + @Override + public void onMagnifierScale(int displayId, float scale) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onPerformScaleAction(displayId, scale); + } + } + + @Override + public void onModeSwitch(int displayId, int newMode) { + mHandler.post(() -> onModeSwitchInternal(displayId, newMode)); + } + + @Override + public void onSettingsPanelVisibilityChanged(int displayId, boolean shown) { + mHandler.post(() -> onSettingsPanelVisibilityChangedInternal(displayId, shown)); + } + }; + + @MainThread + private void onSetMagnifierSizeInternal(int displayId, int index) { + final WindowMagnificationController windowMagnificationController = + mMagnificationControllerSupplier.get(displayId); + if (windowMagnificationController != null) { + windowMagnificationController.changeMagnificationSize(index); } } - @Override - public void onModeSwitch(int displayId, int newMode) { - if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onChangeMagnificationMode(displayId, newMode); + @MainThread + private void onSetDiagonalScrollingInternal(int displayId, boolean enable) { + final WindowMagnificationController windowMagnificationController = + mMagnificationControllerSupplier.get(displayId); + if (windowMagnificationController != null) { + windowMagnificationController.setDiagonalScrolling(enable); + } + } + + @MainThread + private void onEditMagnifierSizeModeInternal(int displayId, boolean enable) { + final WindowMagnificationController windowMagnificationController = + mMagnificationControllerSupplier.get(displayId); + if (windowMagnificationController != null && windowMagnificationController.isActivated()) { + windowMagnificationController.setEditMagnifierSizeMode(enable); + } + } + + @MainThread + private void onModeSwitchInternal(int displayId, int newMode) { + final WindowMagnificationController windowMagnificationController = + mMagnificationControllerSupplier.get(displayId); + final boolean isWindowMagnifierActivated = windowMagnificationController.isActivated(); + final boolean isSwitchToWindowMode = (newMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + final boolean changed = isSwitchToWindowMode ^ isWindowMagnifierActivated; + if (changed) { + final MagnificationSettingsController magnificationSettingsController = + mMagnificationSettingsSupplier.get(displayId); + if (magnificationSettingsController != null) { + magnificationSettingsController.closeMagnificationSettings(); + } + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onChangeMagnificationMode(displayId, newMode); + } + } + } + + @MainThread + private void onSettingsPanelVisibilityChangedInternal(int displayId, boolean shown) { + final WindowMagnificationController windowMagnificationController = + mMagnificationControllerSupplier.get(displayId); + if (windowMagnificationController != null && windowMagnificationController.isActivated()) { + windowMagnificationController.updateDragHandleResourcesIfNeeded(shown); } } @@ -270,17 +449,14 @@ public class WindowMagnification implements CoreStartable, WindowMagnifierCallba private void setWindowMagnificationConnection() { if (mWindowMagnificationConnectionImpl == null) { mWindowMagnificationConnectionImpl = new WindowMagnificationConnectionImpl(this, - mHandler, mModeSwitchesController); + mHandler); } - mModeSwitchesController.setSwitchListenerDelegate( - mWindowMagnificationConnectionImpl::onChangeMagnificationMode); mAccessibilityManager.setWindowMagnificationConnection( mWindowMagnificationConnectionImpl); } private void clearWindowMagnificationConnection() { mAccessibilityManager.setWindowMagnificationConnection(null); - mModeSwitchesController.setSwitchListenerDelegate(null); //TODO: destroy controllers. } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java index aa684faee5ab..c081893eac8b 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java @@ -39,13 +39,11 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S private IWindowMagnificationConnectionCallback mConnectionCallback; private final WindowMagnification mWindowMagnification; private final Handler mHandler; - private final ModeSwitchesController mModeSwitchesController; WindowMagnificationConnectionImpl(@NonNull WindowMagnification windowMagnification, - @Main Handler mainHandler, ModeSwitchesController modeSwitchesController) { + @Main Handler mainHandler) { mWindowMagnification = windowMagnification; mHandler = mainHandler; - mModeSwitchesController = modeSwitchesController; } @Override @@ -86,13 +84,18 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S @Override public void showMagnificationButton(int displayId, int magnificationMode) { mHandler.post( - () -> mModeSwitchesController.showButton(displayId, magnificationMode)); + () -> mWindowMagnification.showMagnificationButton(displayId, magnificationMode)); } @Override public void removeMagnificationButton(int displayId) { mHandler.post( - () -> mModeSwitchesController.removeButton(displayId)); + () -> mWindowMagnification.removeMagnificationButton(displayId)); + } + + @Override + public void removeMagnificationSettingsPanel(int display) { + mHandler.post(() -> mWindowMagnification.hideMagnificationSettingsPanel(display)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index 57c99187c302..a67f706777d9 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -51,6 +51,7 @@ import android.provider.Settings; import android.util.Log; import android.util.Range; import android.util.Size; +import android.util.SparseArray; import android.util.TypedValue; import android.view.Choreographer; import android.view.Display; @@ -103,7 +104,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold private static final Range<Float> A11Y_ACTION_SCALE_RANGE = new Range<>(1.0f, 8.0f); private static final float A11Y_CHANGE_SCALE_DIFFERENCE = 1.0f; private static final float ANIMATION_BOUNCE_EFFECT_SCALE = 1.05f; - private static final float[] MAGNIFICATION_SCALE_OPTIONS = {1.0f, 1.4f, 1.8f, 2.5f}; + private final SparseArray<Float> mMagnificationSizeScaleOptions = new SparseArray<>(); private final Context mContext; private final Resources mResources; @@ -210,9 +211,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold private boolean mOverlapWithGestureInsets; private boolean mIsDragging; - // Window Magnification Setting view - private WindowMagnificationSettings mWindowMagnificationSettings; - private static final int MAX_HORIZONTAL_MOVE_ANGLE = 50; private static final int HORIZONTAL = 1; private static final int VERTICAL = 0; @@ -261,6 +259,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mResources.getInteger(R.integer.magnification_default_scale), UserHandle.USER_CURRENT); + setupMagnificationSizeScaleOptions(); mBounceEffectDuration = mResources.getInteger( com.android.internal.R.integer.config_shortAnimTime); @@ -279,10 +278,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mGestureDetector = new MagnificationGestureDetector(mContext, handler, this); - mWindowMagnificationSettings = - new WindowMagnificationSettings(mContext, mWindowMagnificationSettingsCallback, - mSfVsyncFrameProvider, secureSettings); - // Initialize listeners. mMirrorViewRunnable = () -> { if (mMirrorView != null) { @@ -311,7 +306,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mMirrorViewGeometryVsyncCallback = l -> { - if (isWindowVisible() && mMirrorSurface != null && calculateSourceBounds( + if (isActivated() && mMirrorSurface != null && calculateSourceBounds( mMagnificationFrame, mScale)) { // The final destination for the magnification surface should be at 0,0 // since the ViewRootImpl's position will change @@ -328,13 +323,20 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } }; mUpdateStateDescriptionRunnable = () -> { - if (isWindowVisible()) { + if (isActivated()) { mMirrorView.setStateDescription(formatStateDescription(mScale)); } }; mWindowInsetChangeRunnable = this::onWindowInsetChanged; } + private void setupMagnificationSizeScaleOptions() { + mMagnificationSizeScaleOptions.clear(); + mMagnificationSizeScaleOptions.put(MagnificationSize.SMALL, 1.4f); + mMagnificationSizeScaleOptions.put(MagnificationSize.MEDIUM, 1.8f); + mMagnificationSizeScaleOptions.put(MagnificationSize.LARGE, 2.5f); + } + private void updateDimensions() { mMirrorSurfaceMargin = mResources.getDimensionPixelSize( R.dimen.magnification_mirror_surface_margin); @@ -368,25 +370,27 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold return false; } - @VisibleForTesting void changeMagnificationSize(@MagnificationSize int index) { + if (!mMagnificationSizeScaleOptions.contains(index)) { + return; + } + final float scale = mMagnificationSizeScaleOptions.get(index, 1.0f); final int initSize = Math.min(mWindowBounds.width(), mWindowBounds.height()) / 3; - int size = (int) (initSize * MAGNIFICATION_SCALE_OPTIONS[index]); + int size = (int) (initSize * scale); setWindowSize(size, size); } - @VisibleForTesting void setEditMagnifierSizeMode(boolean enable) { mEditSizeEnable = enable; applyResourcesValues(); - if (isWindowVisible()) { + if (isActivated()) { updateDimensions(); applyTapExcludeRegion(); } } - private void setDiagonalScrolling(boolean enable) { + void setDiagonalScrolling(boolean enable) { mAllowDiagonalScrolling = enable; } @@ -403,22 +407,14 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mAnimationController.deleteWindowMagnification(animationCallback); } - void deleteWindowMagnification() { - deleteWindowMagnification(/* closeSettingPanel= */ true); - } - /** * Deletes the magnification window. */ - void deleteWindowMagnification(boolean closeSettingPanel) { - if (!isWindowVisible()) { + void deleteWindowMagnification() { + if (!isActivated()) { return; } - if (closeSettingPanel) { - closeMagnificationSettings(); - } - if (mMirrorSurface != null) { mTransaction.remove(mMirrorSurface).apply(); mMirrorSurface = null; @@ -453,7 +449,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold final int configDiff = newConfig.diff(mConfiguration); mConfiguration.setTo(newConfig); onConfigurationChanged(configDiff); - mWindowMagnificationSettings.onConfigurationChanged(configDiff); } @Override @@ -494,8 +489,8 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold // Recreate the window again to correct the window appearance due to density or // window size changed not caused by rotation. - if (isWindowVisible() && reCreateWindow) { - deleteWindowMagnification(/* closeSettingPanel= */ false); + if (isActivated() && reCreateWindow) { + deleteWindowMagnification(); enableWindowMagnificationInternal(Float.NaN, Float.NaN, Float.NaN); } } @@ -532,7 +527,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } private void updateAccessibilityWindowTitleIfNeeded() { - if (!isWindowVisible()) return; + if (!isActivated()) return; LayoutParams params = (LayoutParams) mMirrorView.getLayoutParams(); params.accessibilityTitle = getAccessibilityWindowTitle(); mWm.updateViewLayout(mMirrorView, params); @@ -703,23 +698,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } } - private void showMagnificationSettings() { - if (mWindowMagnificationSettings != null) { - mWindowMagnificationSettings.showSettingPanel(); - } - } - - private void closeMagnificationSettings() { - if (mWindowMagnificationSettings != null) { - mWindowMagnificationSettings.hideSettingPanel(); - } - } - - @VisibleForTesting - WindowMagnificationSettings getMagnificationSettings() { - return mWindowMagnificationSettings; - } - /** * Sets the window size with given width and height in pixels without changing the * window center. The width or the height will be clamped in the range @@ -845,7 +823,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold * {@link #mMagnificationFrame}. */ private void updateMirrorViewLayout(boolean computeWindowSize) { - if (!isWindowVisible()) { + if (!isActivated()) { return; } final int maxMirrorViewX = mWindowBounds.width() - mMirrorView.getWidth(); @@ -1018,7 +996,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } private void updateSysUIState(boolean force) { - final boolean overlap = isWindowVisible() && mSystemGestureTop > 0 + final boolean overlap = isActivated() && mSystemGestureTop > 0 && mMirrorViewBounds.bottom > mSystemGestureTop; if (force || overlap != mOverlapWithGestureInsets) { mOverlapWithGestureInsets = overlap; @@ -1113,7 +1091,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold deleteWindowMagnification(); return; } - if (!isWindowVisible()) { + if (!isActivated()) { onConfigurationChanged(mResources.getConfiguration()); mContext.registerComponentCallbacks(this); } @@ -1138,7 +1116,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold calculateMagnificationFrameBoundary(); updateMagnificationFramePosition((int) offsetX, (int) offsetY); - if (!isWindowVisible()) { + if (!isActivated()) { createMirrorWindow(); showControls(); applyResourcesValues(); @@ -1147,13 +1125,19 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } } + // The magnifier is activated when the window is visible, + // and the window is visible when it is existed. + boolean isActivated() { + return mMirrorView != null; + } + /** * Sets the scale of the magnified region if it's visible. * * @param scale the target scale, or {@link Float#NaN} to leave unchanged */ void setScale(float scale) { - if (mAnimationController.isAnimating() || !isWindowVisible() || mScale == scale) { + if (mAnimationController.isAnimating() || !isActivated() || mScale == scale) { return; } @@ -1216,7 +1200,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold * @return {@link Float#NaN} if the window is invisible. */ float getScale() { - return isWindowVisible() ? mScale : Float.NaN; + return isActivated() ? mScale : Float.NaN; } /** @@ -1225,7 +1209,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold * @return the X coordinate. {@link Float#NaN} if the window is invisible. */ float getCenterX() { - return isWindowVisible() ? mMagnificationFrame.exactCenterX() : Float.NaN; + return isActivated() ? mMagnificationFrame.exactCenterX() : Float.NaN; } /** @@ -1234,12 +1218,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold * @return the Y coordinate. {@link Float#NaN} if the window is invisible. */ float getCenterY() { - return isWindowVisible() ? mMagnificationFrame.exactCenterY() : Float.NaN; - } - - //The window is visible when it is existed. - private boolean isWindowVisible() { - return mMirrorView != null; + return isActivated() ? mMagnificationFrame.exactCenterY() : Float.NaN; } private CharSequence formatStateDescription(float scale) { @@ -1273,7 +1252,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold private void handleSingleTap(View view) { int id = view.getId(); if (id == R.id.drag_handle) { - showMagnificationSettings(); + mWindowMagnifierCallback.onClickSettingsButton(mDisplayId); } else if (id == R.id.close_button) { setEditMagnifierSizeMode(false); } else { @@ -1379,40 +1358,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold == Configuration.SCREENLAYOUT_LAYOUTDIR_RTL; } - private WindowMagnificationSettingsCallback mWindowMagnificationSettingsCallback = - new WindowMagnificationSettingsCallback() { - @Override - public void onSetDiagonalScrolling(boolean enable) { - setDiagonalScrolling(enable); - } - - @Override - public void onModeSwitch(int newMode) { - mWindowMagnifierCallback.onModeSwitch(mDisplayId, newMode); - } - - @Override - public void onSetMagnifierSize(@MagnificationSize int index) { - changeMagnificationSize(index); - } - - @Override - public void onEditMagnifierSizeMode(boolean enable) { - setEditMagnifierSizeMode(enable); - } - - @Override - public void onMagnifierScale(float scale) { - mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, - A11Y_ACTION_SCALE_RANGE.clamp(scale)); - } - - @Override - public void onSettingsPanelVisibilityChanged(boolean shown) { - updateDragHandleResourcesIfNeeded(/* settingsPanelIsShown= */ shown); - } - }; - @Override public boolean onStart(float x, float y) { mIsDragging = true; @@ -1449,7 +1394,11 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } } - private void updateDragHandleResourcesIfNeeded(boolean settingsPanelIsShown) { + void updateDragHandleResourcesIfNeeded(boolean settingsPanelIsShown) { + if (!isActivated()) { + return; + } + mDragView.setBackground(mContext.getResources().getDrawable(settingsPanelIsShown ? R.drawable.accessibility_window_magnification_drag_handle_background_change : R.drawable.accessibility_window_magnification_drag_handle_background)); @@ -1476,11 +1425,11 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold pw.println(" mOverlapWithGestureInsets:" + mOverlapWithGestureInsets); pw.println(" mScale:" + mScale); pw.println(" mWindowBounds:" + mWindowBounds); - pw.println(" mMirrorViewBounds:" + (isWindowVisible() ? mMirrorViewBounds : "empty")); + pw.println(" mMirrorViewBounds:" + (isActivated() ? mMirrorViewBounds : "empty")); pw.println(" mMagnificationFrameBoundary:" - + (isWindowVisible() ? mMagnificationFrameBoundary : "empty")); + + (isActivated() ? mMagnificationFrameBoundary : "empty")); pw.println(" mMagnificationFrame:" - + (isWindowVisible() ? mMagnificationFrame : "empty")); + + (isActivated() ? mMagnificationFrame : "empty")); pw.println(" mSourceBounds:" + (mSourceBounds.isEmpty() ? "empty" : mSourceBounds)); pw.println(" mSystemGestureTop:" + mSystemGestureTop); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java index d9f5544c39b9..71c5f247b899 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java @@ -17,6 +17,8 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import android.annotation.IntDef; @@ -82,6 +84,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private boolean mSingleTapDetected = false; private SeekBarWithIconButtonsView mZoomSeekbar; + private LinearLayout mAllowDiagonalScrollingView; private Switch mAllowDiagonalScrollingSwitch; private LinearLayout mPanelView; private LinearLayout mSettingView; @@ -91,19 +94,23 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private ImageButton mLargeButton; private Button mDoneButton; private Button mEditButton; - private ImageButton mChangeModeButton; + private ImageButton mFullScreenButton; private int mLastSelectedButtonIndex = MagnificationSize.NONE; private boolean mAllowDiagonalScrolling = false; private static final float A11Y_CHANGE_SCALE_DIFFERENCE = 1.0f; private static final float A11Y_SCALE_MIN_VALUE = 1.0f; private WindowMagnificationSettingsCallback mCallback; + // the magnification mode that triggers showing the panel + private int mTriggeringMode = ACCESSIBILITY_MAGNIFICATION_MODE_NONE; + @Retention(RetentionPolicy.SOURCE) @IntDef({ MagnificationSize.NONE, MagnificationSize.SMALL, MagnificationSize.MEDIUM, MagnificationSize.LARGE, + MagnificationSize.FULLSCREEN }) /** Denotes the Magnification size type. */ public @interface MagnificationSize { @@ -111,6 +118,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest int SMALL = 1; int MEDIUM = 2; int LARGE = 3; + int FULLSCREEN = 4; } @VisibleForTesting @@ -162,39 +170,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest } } - private CharSequence formatContentDescription(int viewId) { - if (viewId == R.id.magnifier_small_button) { - return mContext.getResources().getString( - R.string.accessibility_magnification_small); - } else if (viewId == R.id.magnifier_medium_button) { - return mContext.getResources().getString( - R.string.accessibility_magnification_medium); - } else if (viewId == R.id.magnifier_large_button) { - return mContext.getResources().getString( - R.string.accessibility_magnification_large); - } else if (viewId == R.id.magnifier_done_button) { - return mContext.getResources().getString( - R.string.accessibility_magnification_done); - } else if (viewId == R.id.magnifier_edit_button) { - return mContext.getResources().getString( - R.string.accessibility_resize); - } else { - return mContext.getResources().getString( - R.string.magnification_mode_switch_description); - } - } - - private final AccessibilityDelegate mButtonDelegate = new AccessibilityDelegate() { + private final AccessibilityDelegate mPanelDelegate = new AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); - info.setContentDescription(formatContentDescription(host.getId())); - final AccessibilityAction clickAction = new AccessibilityAction( - AccessibilityAction.ACTION_CLICK.getId(), mContext.getResources().getString( - R.string.magnification_mode_switch_click_label)); - info.addAction(clickAction); - info.setClickable(true); info.addAction(new AccessibilityAction(R.id.accessibility_action_move_up, mContext.getString(R.string.accessibility_control_move_up))); info.addAction(new AccessibilityAction(R.id.accessibility_action_move_down, @@ -247,13 +227,12 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest setMagnifierSize(MagnificationSize.MEDIUM); } else if (id == R.id.magnifier_large_button) { setMagnifierSize(MagnificationSize.LARGE); + } else if (id == R.id.magnifier_full_button) { + setMagnifierSize(MagnificationSize.FULLSCREEN); } else if (id == R.id.magnifier_edit_button) { editMagnifierSizeMode(true); } else if (id == R.id.magnifier_done_button) { hideSettingPanel(); - } else if (id == R.id.magnifier_full_button) { - hideSettingPanel(); - toggleMagnificationMode(); } } }; @@ -278,7 +257,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest @Override public boolean onFinish(float xOffset, float yOffset) { if (!mSingleTapDetected) { - showSettingPanel(); + showSettingPanel(mTriggeringMode); } mSingleTapDetected = false; return true; @@ -318,27 +297,43 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mCallback.onSettingsPanelVisibilityChanged(/* shown= */ false); } - public void showSettingPanel() { - showSettingPanel(true); + /** + * Shows magnification settings panel. The panel ui would be various for + * different magnification mode. + * + * @param mode The magnification mode + * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW + * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN + */ + public void showSettingPanel(int mode) { + showSettingPanel(mode, true); + } + + public boolean isSettingPanelShowing() { + return mIsVisible; } public void setScaleSeekbar(float scale) { setSeekbarProgress(scale); } - private void toggleMagnificationMode() { - mCallback.onModeSwitch(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + private void transitToMagnificationMode(int mode) { + mCallback.onModeSwitch(mode); } /** - * Shows magnification panel for set window magnification. + * Shows magnification panel for set magnification. * When the panel is going to be visible by calling this method, the layout position can be * reset depending on the flag. * + * @param mode The magnification mode * @param resetPosition if the button position needs be reset */ - private void showSettingPanel(boolean resetPosition) { + private void showSettingPanel(int mode, boolean resetPosition) { if (!mIsVisible) { + updateUIControlsIfNeed(mode); + mTriggeringMode = mode; + if (resetPosition) { mDraggableWindowBounds.set(getDraggableWindowBounds()); mParams.x = mDraggableWindowBounds.right; @@ -355,6 +350,37 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } + private void updateUIControlsIfNeed(int mode) { + if (mode == mTriggeringMode) { + return; + } + + int selectedButtonIndex = mLastSelectedButtonIndex; + switch (mode) { + case ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: + // set the edit button visibility to View.INVISIBLE to keep the height, to prevent + // the size title from too close to the size buttons + mEditButton.setVisibility(View.INVISIBLE); + mAllowDiagonalScrollingView.setVisibility(View.GONE); + // force the fullscreen button showing + selectedButtonIndex = MagnificationSize.FULLSCREEN; + break; + + case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: + mEditButton.setVisibility(View.VISIBLE); + mAllowDiagonalScrollingView.setVisibility(View.VISIBLE); + if (selectedButtonIndex == MagnificationSize.FULLSCREEN) { + selectedButtonIndex = MagnificationSize.NONE; + } + break; + + default: + break; + } + + updateSelectedButton(selectedButtonIndex); + } + private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -378,13 +404,15 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mSettingView.setFocusableInTouchMode(true); mSettingView.setOnTouchListener(this::onTouch); + mSettingView.setAccessibilityDelegate(mPanelDelegate); + mPanelView = mSettingView.findViewById(R.id.magnifier_panel_view); mSmallButton = mSettingView.findViewById(R.id.magnifier_small_button); mMediumButton = mSettingView.findViewById(R.id.magnifier_medium_button); mLargeButton = mSettingView.findViewById(R.id.magnifier_large_button); mDoneButton = mSettingView.findViewById(R.id.magnifier_done_button); mEditButton = mSettingView.findViewById(R.id.magnifier_edit_button); - mChangeModeButton = mSettingView.findViewById(R.id.magnifier_full_button); + mFullScreenButton = mSettingView.findViewById(R.id.magnifier_full_button); mZoomSeekbar = mSettingView.findViewById(R.id.magnifier_zoom_slider); float scale = mSecureSettings.getFloatForUser( @@ -393,6 +421,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest setSeekbarProgress(scale); mZoomSeekbar.setOnSeekBarChangeListener(new ZoomSeekbarChangeListener()); + mAllowDiagonalScrollingView = + (LinearLayout) mSettingView.findViewById(R.id.magnifier_horizontal_lock_view); mAllowDiagonalScrollingSwitch = (Switch) mSettingView.findViewById(R.id.magnifier_horizontal_lock_switch); mAllowDiagonalScrollingSwitch.setChecked(mAllowDiagonalScrolling); @@ -400,22 +430,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest toggleDiagonalScrolling(); }); - mSmallButton.setAccessibilityDelegate(mButtonDelegate); mSmallButton.setOnClickListener(mButtonClickListener); - - mMediumButton.setAccessibilityDelegate(mButtonDelegate); mMediumButton.setOnClickListener(mButtonClickListener); - - mLargeButton.setAccessibilityDelegate(mButtonDelegate); mLargeButton.setOnClickListener(mButtonClickListener); - - mDoneButton.setAccessibilityDelegate(mButtonDelegate); mDoneButton.setOnClickListener(mButtonClickListener); - - mChangeModeButton.setAccessibilityDelegate(mButtonDelegate); - mChangeModeButton.setOnClickListener(mButtonClickListener); - - mEditButton.setAccessibilityDelegate(mButtonDelegate); + mFullScreenButton.setOnClickListener(mButtonClickListener); mEditButton.setOnClickListener(mButtonClickListener); mSettingView.setOnApplyWindowInsetsListener((v, insets) -> { @@ -446,7 +465,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest hideSettingPanel(/* resetPosition= */ false); inflateView(); if (showSettingPanelAfterThemeChange) { - showSettingPanel(/* resetPosition= */ false); + showSettingPanel(mTriggeringMode, /* resetPosition= */ false); } return; } @@ -501,7 +520,18 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest } private void setMagnifierSize(@MagnificationSize int index) { - mCallback.onSetMagnifierSize(index); + if (index == MagnificationSize.FULLSCREEN) { + // transit to fullscreen magnifier if needed + transitToMagnificationMode(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + } else if (index != MagnificationSize.NONE) { + // update the window magnifier size + mCallback.onSetMagnifierSize(index); + // transit to window magnifier if needed + transitToMagnificationMode(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + } else { + return; + } + updateSelectedButton(index); } @@ -573,6 +603,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mMediumButton.setSelected(false); } else if (mLastSelectedButtonIndex == MagnificationSize.LARGE) { mLargeButton.setSelected(false); + } else if (mLastSelectedButtonIndex == MagnificationSize.FULLSCREEN) { + mFullScreenButton.setSelected(false); } // Set the state for selected button @@ -582,6 +614,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mMediumButton.setSelected(true); } else if (index == MagnificationSize.LARGE) { mLargeButton.setSelected(true); + } else if (index == MagnificationSize.FULLSCREEN) { + mFullScreenButton.setSelected(true); } mLastSelectedButtonIndex = index; diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java index 1d833402b1f4..3dbff5d7898f 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java @@ -29,7 +29,8 @@ public interface WindowMagnificationSettingsCallback { * * @param index Magnification size index. * 0 : MagnificationSize.NONE, 1 : MagnificationSize.SMALL, - * 2 : MagnificationSize.MEDIUM, 3: MagnificationSize.LARGE + * 2 : MagnificationSize.MEDIUM, 3: MagnificationSize.LARGE, + * 4 : MagnificationSize.FULLSCREEN */ void onSetMagnifierSize(@MagnificationSize int index); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java index 19caaf431e0a..e18161d658a8 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java @@ -62,10 +62,9 @@ interface WindowMagnifierCallback { void onMove(int displayId); /** - * Called when magnification mode changed. + * Called when magnification settings button clicked. * * @param displayId The logical display id. - * @param newMode Magnification mode. */ - void onModeSwitch(int displayId, int newMode); + void onClickSettingsButton(int displayId); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 3f22f18f6fa7..868ffcf54fe1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -42,8 +42,8 @@ import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.commandline.Command import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.BiometricUnlockController -import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController @@ -61,9 +61,7 @@ import javax.inject.Provider * The ripple uses the accent color of the current theme. */ @CentralSurfacesScope -class AuthRippleController -@Inject -constructor( +class AuthRippleController @Inject constructor( private val centralSurfaces: CentralSurfaces, private val sysuiContext: Context, private val authController: AuthController, @@ -73,18 +71,18 @@ constructor( private val wakefulnessLifecycle: WakefulnessLifecycle, private val commandRegistry: CommandRegistry, private val notificationShadeWindowController: NotificationShadeWindowController, + private val bypassController: KeyguardBypassController, private val biometricUnlockController: BiometricUnlockController, private val udfpsControllerProvider: Provider<UdfpsController>, private val statusBarStateController: StatusBarStateController, private val featureFlags: FeatureFlags, private val logger: KeyguardLogger, - rippleView: AuthRippleView? -) : - ViewController<AuthRippleView>(rippleView), - KeyguardStateController.Callback, + rippleView: AuthRippleView? +) : ViewController<AuthRippleView>(rippleView), KeyguardStateController.Callback, WakefulnessLifecycle.Observer { - @VisibleForTesting internal var startLightRevealScrimOnKeyguardFadingAway = false + @VisibleForTesting + internal var startLightRevealScrimOnKeyguardFadingAway = false var lightRevealScrimAnimator: ValueAnimator? = null var fingerprintSensorLocation: Point? = null private var faceSensorLocation: Point? = null @@ -93,16 +91,6 @@ constructor( private var udfpsController: UdfpsController? = null private var udfpsRadius: Float = -1f - private val biometricModeListener = object : BiometricUnlockController.BiometricModeListener { - override fun onModeChanged(mode: Int) { - // isBiometricUnlock does not cover the scenario when biometrics unlocks - // the device while the bouncer is showing. - if (biometricUnlockController.isBiometricUnlock || mode == MODE_DISMISS_BOUNCER) { - showUnlockRipple(biometricUnlockController.biometricType) - } - } - } - @VisibleForTesting public override fun onViewAttached() { authController.addCallback(authControllerCallback) @@ -114,7 +102,6 @@ constructor( keyguardStateController.addCallback(this) wakefulnessLifecycle.addObserver(this) commandRegistry.registerCommand("auth-ripple") { AuthRippleCommand() } - biometricUnlockController.addBiometricModeListener(biometricModeListener) } @VisibleForTesting @@ -126,7 +113,6 @@ constructor( keyguardStateController.removeCallback(this) wakefulnessLifecycle.removeObserver(this) commandRegistry.unregisterCommand("auth-ripple") - biometricUnlockController.removeBiometricModeListener(biometricModeListener) notificationShadeWindowController.setForcePluginOpen(false, this) } @@ -157,7 +143,10 @@ constructor( showUnlockedRipple() } } else if (biometricSourceType == BiometricSourceType.FACE) { - faceSensorLocation?.let { + if (!bypassController.canBypass() && !authController.isUdfpsFingerDown) { + return + } + faceSensorLocation?.let { mView.setSensorLocation(it) circleReveal = CircleReveal( it.x, @@ -278,6 +267,7 @@ constructor( if (biometricSourceType == BiometricSourceType.FINGERPRINT) { mView.fadeDwellRipple() } + showUnlockRipple(biometricSourceType) } override fun onBiometricAuthFailed(biometricSourceType: BiometricSourceType) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index e7ec3eb7e81a..cbc0a1ba2b39 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -60,6 +60,7 @@ import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.util.LatencyTracker; @@ -171,6 +172,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull private final SecureSettings mSecureSettings; @NonNull private final UdfpsUtils mUdfpsUtils; @NonNull private final InputManager mInputManager; + private final boolean mIgnoreRefreshRate; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. @@ -816,6 +818,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { mExecution = execution; mVibrator = vibrator; mInflater = inflater; + mIgnoreRefreshRate = mContext.getResources() + .getBoolean(R.bool.config_ignoreUdfpsVote); // The fingerprint manager is queried for UDFPS before this class is constructed, so the // fingerprint manager should never be null. mFingerprintManager = checkNotNull(fingerprintManager); @@ -1069,6 +1073,18 @@ public class UdfpsController implements DozeReceiver, Dumpable { return mOnFingerDown; } + private void dispatchOnUiReady(long requestId) { + if (mAlternateTouchProvider != null) { + mBiometricExecutor.execute(() -> { + mAlternateTouchProvider.onUiReady(); + mLatencyTracker.onActionEnd(LatencyTracker.ACTION_UDFPS_ILLUMINATE); + }); + } else { + mFingerprintManager.onUiReady(requestId, mSensorProps.sensorId); + mLatencyTracker.onActionEnd(LatencyTracker.ACTION_UDFPS_ILLUMINATE); + } + } + private void onFingerDown( long requestId, int x, @@ -1146,17 +1162,11 @@ public class UdfpsController implements DozeReceiver, Dumpable { Trace.endAsyncSection("UdfpsController.e2e.onPointerDown", 0); final UdfpsView view = mOverlay.getOverlayView(); if (view != null && isOptical()) { - view.configureDisplay(() -> { - if (mAlternateTouchProvider != null) { - mBiometricExecutor.execute(() -> { - mAlternateTouchProvider.onUiReady(); - mLatencyTracker.onActionEnd(LatencyTracker.ACTION_UDFPS_ILLUMINATE); - }); - } else { - mFingerprintManager.onUiReady(requestId, mSensorProps.sensorId); - mLatencyTracker.onActionEnd(LatencyTracker.ACTION_UDFPS_ILLUMINATE); - } - }); + if (mIgnoreRefreshRate) { + dispatchOnUiReady(requestId); + } else { + view.configureDisplay(() -> dispatchOnUiReady(requestId)); + } } for (Callback cb : mCallbacks) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt index 3b53eff9dfc5..000213fabe0d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt @@ -16,6 +16,7 @@ package com.android.systemui.biometrics.domain.interactor +import android.hardware.biometrics.AuthenticateOptions import android.hardware.biometrics.IBiometricContextListener import android.util.Log import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging @@ -23,7 +24,8 @@ import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCall import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN @@ -39,6 +41,7 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch @@ -49,8 +52,8 @@ import kotlinx.coroutines.launch */ interface LogContextInteractor { - /** If the device is dozing. */ - val isDozing: Flow<Boolean> + /** If the device is showing aod. */ + val isAod: Flow<Boolean> /** If the device is currently awake with the screen on. */ val isAwake: Flow<Boolean> @@ -58,6 +61,9 @@ interface LogContextInteractor { /** Current device fold state, defined as [IBiometricContextListener.FoldState]. */ val foldState: Flow<Int> + /** Current display state, defined as [AuthenticateOptions.DisplayState] */ + val displayState: Flow<Int> + /** * Add a permanent context listener. * @@ -72,46 +78,41 @@ class LogContextInteractorImpl @Inject constructor( @Application private val applicationScope: CoroutineScope, - private val statusBarStateController: StatusBarStateController, - private val wakefulnessLifecycle: WakefulnessLifecycle, private val foldProvider: FoldStateProvider, + keyguardTransitionInteractor: KeyguardTransitionInteractor, ) : LogContextInteractor { init { foldProvider.start() } - override val isDozing = - conflatedCallbackFlow { - val callback = - object : StatusBarStateController.StateListener { - override fun onDozingChanged(isDozing: Boolean) { - trySendWithFailureLogging(isDozing, TAG) - } - } - - statusBarStateController.addCallback(callback) - trySendWithFailureLogging(statusBarStateController.isDozing, TAG) - awaitClose { statusBarStateController.removeCallback(callback) } + override val displayState = + keyguardTransitionInteractor.startedKeyguardTransitionStep.map { + when (it.to) { + KeyguardState.LOCKSCREEN, + KeyguardState.OCCLUDED, + KeyguardState.ALTERNATE_BOUNCER, + KeyguardState.PRIMARY_BOUNCER -> AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN + KeyguardState.AOD -> AuthenticateOptions.DISPLAY_STATE_AOD + KeyguardState.OFF, + KeyguardState.DOZING -> AuthenticateOptions.DISPLAY_STATE_NO_UI + KeyguardState.DREAMING -> AuthenticateOptions.DISPLAY_STATE_SCREENSAVER + else -> AuthenticateOptions.DISPLAY_STATE_UNKNOWN } - .distinctUntilChanged() - - override val isAwake = - conflatedCallbackFlow { - val callback = - object : WakefulnessLifecycle.Observer { - override fun onFinishedWakingUp() { - trySendWithFailureLogging(true, TAG) - } + } - override fun onStartedGoingToSleep() { - trySendWithFailureLogging(false, TAG) - } - } + override val isAod = + displayState.map { it == AuthenticateOptions.DISPLAY_STATE_AOD }.distinctUntilChanged() - wakefulnessLifecycle.addObserver(callback) - trySendWithFailureLogging(wakefulnessLifecycle.isAwake, TAG) - awaitClose { wakefulnessLifecycle.removeObserver(callback) } + override val isAwake = + displayState + .map { + when (it) { + AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN, + AuthenticateOptions.DISPLAY_STATE_SCREENSAVER, + AuthenticateOptions.DISPLAY_STATE_UNKNOWN -> true + else -> false + } } .distinctUntilChanged() @@ -146,8 +147,8 @@ constructor( override fun addBiometricContextListener(listener: IBiometricContextListener): Job { return applicationScope.launch { - combine(isDozing, isAwake) { doze, awake -> doze to awake } - .onEach { (doze, awake) -> listener.onDozeChanged(doze, awake) } + combine(isAod, isAwake) { doze, awake -> doze to awake } + .onEach { (aod, awake) -> listener.onDozeChanged(aod, awake) } .catch { t -> Log.w(TAG, "failed to notify new doze state", t) } .launchIn(this) @@ -156,6 +157,12 @@ constructor( .catch { t -> Log.w(TAG, "failed to notify new fold state", t) } .launchIn(this) + displayState + .distinctUntilChanged() + .onEach { state -> listener.onDisplayStateChanged(state) } + .catch { t -> Log.w(TAG, "failed to notify new display state", t) } + .launchIn(this) + listener.asBinder().linkToDeath({ cancel() }, 0) } } diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastSender.kt b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastSender.kt index 6615f6b0b9eb..f9613d505d87 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastSender.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastSender.kt @@ -109,7 +109,7 @@ class BroadcastSender @Inject constructor( @AnyThread fun closeSystemDialogs() { sendInBackground { - context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) + context.closeSystemDialogs() } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java index f83885b7bb32..d6c85fbaf5a9 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java @@ -16,6 +16,8 @@ package com.android.systemui.classifier; +import static com.android.systemui.classifier.FalsingModule.IS_FOLDABLE_DEVICE; + import android.hardware.devicestate.DeviceStateManager.FoldStateListener; import android.util.DisplayMetrics; import android.view.MotionEvent; @@ -30,6 +32,7 @@ import java.util.ArrayList; import java.util.List; import javax.inject.Inject; +import javax.inject.Named; /** * Acts as a cache and utility class for FalsingClassifiers. @@ -46,6 +49,7 @@ public class FalsingDataProvider { private BatteryController mBatteryController; private final FoldStateListener mFoldStateListener; private final DockManager mDockManager; + private boolean mIsFoldableDevice; private final float mXdpi; private final float mYdpi; private final List<SessionListener> mSessionListeners = new ArrayList<>(); @@ -70,7 +74,8 @@ public class FalsingDataProvider { DisplayMetrics displayMetrics, BatteryController batteryController, FoldStateListener foldStateListener, - DockManager dockManager) { + DockManager dockManager, + @Named(IS_FOLDABLE_DEVICE) boolean isFoldableDevice) { mXdpi = displayMetrics.xdpi; mYdpi = displayMetrics.ydpi; mWidthPixels = displayMetrics.widthPixels; @@ -78,6 +83,7 @@ public class FalsingDataProvider { mBatteryController = batteryController; mFoldStateListener = foldStateListener; mDockManager = dockManager; + mIsFoldableDevice = isFoldableDevice; FalsingClassifier.logInfo("xdpi, ydpi: " + getXdpi() + ", " + getYdpi()); FalsingClassifier.logInfo("width, height: " + getWidthPixels() + ", " + getHeightPixels()); @@ -417,7 +423,7 @@ public class FalsingDataProvider { } public boolean isUnfolded() { - return Boolean.FALSE.equals(mFoldStateListener.getFolded()); + return mIsFoldableDevice && Boolean.FALSE.equals(mFoldStateListener.getFolded()); } /** Implement to be alerted abotu the beginning and ending of falsing tracking. */ diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java index 5302af9db836..c7f3b2d08efd 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java @@ -43,6 +43,7 @@ public interface FalsingModule { String LONG_TAP_TOUCH_SLOP = "falsing_long_tap_slop"; String DOUBLE_TAP_TOUCH_SLOP = "falsing_double_tap_touch_slop"; String DOUBLE_TAP_TIMEOUT_MS = "falsing_double_tap_timeout_ms"; + String IS_FOLDABLE_DEVICE = "falsing_foldable_device"; /** */ @Binds @@ -89,4 +90,16 @@ public interface FalsingModule { static float providesLongTapTouchSlop(ViewConfiguration viewConfiguration) { return viewConfiguration.getScaledTouchSlop() * 1.25f; } + + /** */ + @Provides + @Named(IS_FOLDABLE_DEVICE) + static boolean providesIsFoldableDevice(@Main Resources resources) { + try { + return resources.getIntArray( + com.android.internal.R.array.config_foldedDeviceStates).length != 0; + } catch (Resources.NotFoundException e) { + return false; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt b/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt index 461caccc86d3..0218f452a13b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt @@ -17,10 +17,15 @@ package com.android.systemui.controls.start +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.os.UserHandle +import android.os.UserManager import androidx.annotation.WorkerThread import com.android.systemui.CoreStartable +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.management.ControlsListingController @@ -53,6 +58,8 @@ constructor( private val userTracker: UserTracker, private val authorizedPanelsRepository: AuthorizedPanelsRepository, private val selectedComponentRepository: SelectedComponentRepository, + private val userManager: UserManager, + private val broadcastDispatcher: BroadcastDispatcher, ) : CoreStartable { // These two controllers can only be accessed after `start` method once we've checked if the @@ -71,7 +78,9 @@ constructor( } } - override fun start() { + override fun start() {} + + override fun onBootCompleted() { if (!controlsComponent.isEnabled()) { // Controls is disabled, we don't need this anymore return @@ -112,11 +121,30 @@ constructor( } private fun bindToPanel() { + if (userManager.isUserUnlocked(userTracker.userId)) { + bindToPanelInternal() + } else { + broadcastDispatcher.registerReceiver( + receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (userManager.isUserUnlocked(userTracker.userId)) { + bindToPanelInternal() + broadcastDispatcher.unregisterReceiver(this) + } + } + }, + filter = IntentFilter(Intent.ACTION_USER_UNLOCKED), + executor = executor, + user = userTracker.userHandle, + ) + } + } + + private fun bindToPanelInternal() { val currentSelection = controlsController.getPreferredSelection() val panels = - controlsListingController.getCurrentServices().filter { it.panelActivity != null } - if ( - currentSelection is SelectedItem.PanelItem && + controlsListingController.getCurrentServices().filter { it.panelActivity != null } + if (currentSelection is SelectedItem.PanelItem && panels.firstOrNull { it.componentName == currentSelection.componentName } != null ) { controlsController.bindComponentForPanel(currentSelection.componentName) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt index 224eb1ca409a..c964b9654955 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt @@ -47,7 +47,8 @@ import javax.inject.Inject * destroyed on SCREEN_OFF events, due to issues with occluded activities over lockscreen as well as * user expectations for the activity to not continue running. */ -class ControlsActivity @Inject constructor( +// Open for testing +open class ControlsActivity @Inject constructor( private val uiController: ControlsUiController, private val broadcastDispatcher: BroadcastDispatcher, private val dreamManager: IDreamManager, @@ -98,8 +99,11 @@ class ControlsActivity @Inject constructor( override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - if (lastConfiguration.diff(newConfig) and ActivityInfo.CONFIG_ORIENTATION != 0 ) { - uiController.onOrientationChange() + val interestingFlags = ActivityInfo.CONFIG_ORIENTATION or + ActivityInfo.CONFIG_SCREEN_SIZE or + ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE + if (lastConfiguration.diff(newConfig) and interestingFlags != 0 ) { + uiController.onSizeChange() } lastConfiguration = newConfig } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsPopupMenu.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsPopupMenu.kt new file mode 100644 index 000000000000..d08bc48e945d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsPopupMenu.kt @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.controls.ui + +import android.content.Context +import android.content.res.Resources +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.view.Gravity +import android.view.View +import android.widget.ListPopupWindow +import android.widget.PopupWindow +import com.android.systemui.R + +class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { + + private val resources: Resources = context.resources + + private val listDividerHeight: Int = + resources.getDimensionPixelSize(R.dimen.control_popup_items_divider_height) + private val horizontalMargin: Int = + resources.getDimensionPixelSize(R.dimen.control_popup_horizontal_margin) + private val maxWidth: Int = resources.getDimensionPixelSize(R.dimen.control_popup_max_width) + + private val dialogBackground: Drawable = resources.getDrawable(R.drawable.controls_popup_bg)!! + private val dimDrawable: Drawable = ColorDrawable(resources.getColor(R.color.control_popup_dim)) + + private var dismissListener: PopupWindow.OnDismissListener? = null + + init { + setBackgroundDrawable(dialogBackground) + + inputMethodMode = INPUT_METHOD_NOT_NEEDED + isModal = true + setDropDownGravity(Gravity.START) + + // dismiss method isn't called when popup is hidden by outside touch. So we need to + // override a listener to remove a dimming foreground + super.setOnDismissListener { + anchorView?.rootView?.foreground = null + dismissListener?.onDismiss() + } + } + + override fun show() { + // need to call show() first in order to construct the listView + super.show() + + val paddedWidth = resources.displayMetrics.widthPixels - 2 * horizontalMargin + width = maxWidth.coerceAtMost(paddedWidth) + anchorView?.let { + horizontalOffset = -width / 2 + it.width / 2 + verticalOffset = -it.height / 2 + if (it.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + horizontalOffset = -horizontalOffset + } + + it.rootView.foreground = dimDrawable + } + + with(listView!!) { + clipToOutline = true + background = dialogBackground + dividerHeight = listDividerHeight + } + + // actual show takes into account updated ListView specs + super.show() + } + + override fun setOnDismissListener(listener: PopupWindow.OnDismissListener?) { + dismissListener = listener + } +} diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt index 3ecf4236656d..0cc4683baef1 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt @@ -65,7 +65,7 @@ interface ControlsUiController { */ fun getPreferredSelectedItem(structures: List<StructureInfo>): SelectedItem - fun onOrientationChange() + fun onSizeChange() } sealed class SelectedItem { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 868e52784290..c20af074c71e 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -604,7 +604,7 @@ class ControlsUiControllerImpl @Inject constructor ( setCompoundDrawablesRelative(selected.icon, null, null, null) } - val anchor = parent.requireViewById<ViewGroup>(R.id.controls_header) + val anchor = parent.requireViewById<View>(R.id.app_or_structure_spinner) if (items.size == 1) { spinner.setBackground(null) anchor.setOnClickListener(null) @@ -617,10 +617,7 @@ class ControlsUiControllerImpl @Inject constructor ( anchor.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { - popup = GlobalActionsPopupMenu( - popupThemedContext, - true /* isDropDownMode */ - ).apply { + popup = ControlsPopupMenu(popupThemedContext).apply { setAnchorView(anchor) setAdapter(adapter) @@ -809,7 +806,7 @@ class ControlsUiControllerImpl @Inject constructor ( } } - override fun onOrientationChange() { + override fun onSizeChange() { selectionItem?.let { when (selectedItem) { is SelectedItem.StructureItem -> createListView(it) @@ -868,22 +865,24 @@ internal data class SelectionItem( } } -private class ItemAdapter( - val parentContext: Context, - val resource: Int -) : ArrayAdapter<SelectionItem>(parentContext, resource) { +private class ItemAdapter(parentContext: Context, val resource: Int) : + ArrayAdapter<SelectionItem>(parentContext, resource) { - val layoutInflater = LayoutInflater.from(context) + private val layoutInflater = LayoutInflater.from(context)!! override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val item = getItem(position) + val item: SelectionItem = getItem(position)!! val view = convertView ?: layoutInflater.inflate(resource, parent, false) - view.requireViewById<TextView>(R.id.controls_spinner_item).apply { - setText(item.getTitle()) - } - view.requireViewById<ImageView>(R.id.app_icon).apply { - setImageDrawable(item.icon) + with(view.tag as? ViewHolder ?: ViewHolder(view).also { view.tag = it }) { + titleView.text = item.getTitle() + iconView.setImageDrawable(item.icon) } return view } + + private class ViewHolder(itemView: View) { + + val titleView: TextView = itemView.requireViewById(R.id.controls_spinner_item) + val iconView: ImageView = itemView.requireViewById(R.id.app_icon) + } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt index 9bf6b2a5b42b..df236e7f9c8f 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt @@ -17,6 +17,7 @@ package com.android.systemui.dagger import com.android.keyguard.KeyguardBiometricLockoutLogger +import com.android.systemui.ChooserPinMigration import com.android.systemui.ChooserSelector import com.android.systemui.CoreStartable import com.android.systemui.LatencyTester @@ -75,6 +76,13 @@ abstract class SystemUICoreStartableModule { @ClassKey(AuthController::class) abstract fun bindAuthController(service: AuthController): CoreStartable + /** Inject into ChooserPinMigration. */ + @Binds + @IntoMap + @ClassKey(ChooserPinMigration::class) + @PerUser + abstract fun bindChooserPinMigration(sysui: ChooserPinMigration): CoreStartable + /** Inject into ChooserCoreStartable. */ @Binds @IntoMap diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java index a7b3bbcbc37b..2ea7bce66452 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java @@ -25,7 +25,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Rect; import android.graphics.Region; -import android.util.DisplayMetrics; import android.util.Log; import android.view.GestureDetector; import android.view.InputEvent; @@ -89,8 +88,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private final FlingAnimationUtils mFlingAnimationUtils; private final FlingAnimationUtils mFlingAnimationUtilsClosing; - private final DisplayMetrics mDisplayMetrics; - private Boolean mCapture; private Boolean mExpanded; @@ -161,7 +158,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { // (0). final float dragDownAmount = e2.getY() - e1.getY(); final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY()) - / mCentralSurfaces.get().getDisplayHeight(); + / mTouchSession.getBounds().height(); setPanelExpansion(mBouncerInitiallyShowing ? screenTravelPercentage : 1 - screenTravelPercentage, dragDownAmount); return true; @@ -202,7 +199,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @Inject public BouncerSwipeTouchHandler( - DisplayMetrics displayMetrics, ScrimManager scrimManager, Optional<CentralSurfaces> centralSurfaces, NotificationShadeWindowController notificationShadeWindowController, @@ -214,7 +210,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { FlingAnimationUtils flingAnimationUtilsClosing, @Named(SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage, UiEventLogger uiEventLogger) { - mDisplayMetrics = displayMetrics; mCentralSurfaces = centralSurfaces; mScrimManager = scrimManager; mNotificationShadeWindowController = notificationShadeWindowController; @@ -227,19 +222,20 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } @Override - public void getTouchInitiationRegion(Region region) { + public void getTouchInitiationRegion(Rect bounds, Region region) { + final int width = bounds.width(); + final int height = bounds.height(); + if (mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) { - region.op(new Rect(0, 0, mDisplayMetrics.widthPixels, + region.op(new Rect(0, 0, width, Math.round( - mDisplayMetrics.heightPixels * mBouncerZoneScreenPercentage)), + height * mBouncerZoneScreenPercentage)), Region.Op.UNION); } else { region.op(new Rect(0, - Math.round( - mDisplayMetrics.heightPixels - * (1 - mBouncerZoneScreenPercentage)), - mDisplayMetrics.widthPixels, - mDisplayMetrics.heightPixels), + Math.round(height * (1 - mBouncerZoneScreenPercentage)), + width, + height), Region.Op.UNION); } } @@ -356,7 +352,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } // The animation utils deal in pixel units, rather than expansion height. - final float viewHeight = mCentralSurfaces.get().getDisplayHeight(); + final float viewHeight = mTouchSession.getBounds().height(); final float currentHeight = viewHeight * mCurrentExpansion; final float targetHeight = viewHeight * expansion; final float expansionHeight = targetHeight - currentHeight; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java index b8b459e1c68c..43e4c62b60d6 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java @@ -16,6 +16,9 @@ package com.android.systemui.dreams.touch; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + +import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; import android.view.InputEvent; @@ -31,6 +34,7 @@ import androidx.lifecycle.LifecycleOwner; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.touch.dagger.InputSessionComponent; import com.android.systemui.shared.system.InputChannelCompat; +import com.android.systemui.util.display.DisplayHelper; import com.google.common.util.concurrent.ListenableFuture; @@ -69,7 +73,8 @@ public class DreamOverlayTouchMonitor { } final TouchSessionImpl touchSession = - new TouchSessionImpl(this, touchSessionImpl); + new TouchSessionImpl(this, touchSessionImpl.getBounds(), + touchSessionImpl); mActiveTouchSessions.add(touchSession); completer.set(touchSession); }); @@ -120,10 +125,13 @@ public class DreamOverlayTouchMonitor { private final TouchSessionImpl mPredecessor; private final DreamOverlayTouchMonitor mTouchMonitor; + private final Rect mBounds; - TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, TouchSessionImpl predecessor) { + TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, Rect bounds, + TouchSessionImpl predecessor) { mPredecessor = predecessor; mTouchMonitor = touchMonitor; + mBounds = bounds; } @Override @@ -185,6 +193,11 @@ public class DreamOverlayTouchMonitor { private void onRemoved() { mCallbacks.forEach(callback -> callback.onRemoved()); } + + @Override + public Rect getBounds() { + return mBounds; + } } /** @@ -242,6 +255,7 @@ public class DreamOverlayTouchMonitor { private final HashSet<TouchSessionImpl> mActiveTouchSessions = new HashSet<>(); private final Collection<DreamTouchHandler> mHandlers; + private final DisplayHelper mDisplayHelper; private InputChannelCompat.InputEventListener mInputEventListener = new InputChannelCompat.InputEventListener() { @@ -253,8 +267,11 @@ public class DreamOverlayTouchMonitor { new HashMap<>(); for (DreamTouchHandler handler : mHandlers) { + final Rect maxBounds = mDisplayHelper.getMaxBounds(ev.getDisplayId(), + TYPE_APPLICATION_OVERLAY); + final Region initiationRegion = Region.obtain(); - handler.getTouchInitiationRegion(initiationRegion); + handler.getTouchInitiationRegion(maxBounds, initiationRegion); if (!initiationRegion.isEmpty()) { // Initiation regions require a motion event to determine pointer location @@ -272,8 +289,8 @@ public class DreamOverlayTouchMonitor { } } - final TouchSessionImpl sessionStack = - new TouchSessionImpl(DreamOverlayTouchMonitor.this, null); + final TouchSessionImpl sessionStack = new TouchSessionImpl( + DreamOverlayTouchMonitor.this, maxBounds, null); mActiveTouchSessions.add(sessionStack); sessionMap.put(handler, sessionStack); } @@ -389,11 +406,13 @@ public class DreamOverlayTouchMonitor { @Main Executor executor, Lifecycle lifecycle, InputSessionComponent.Factory inputSessionFactory, + DisplayHelper displayHelper, Set<DreamTouchHandler> handlers) { mHandlers = handlers; mInputSessionFactory = inputSessionFactory; mExecutor = executor; mLifecycle = lifecycle; + mDisplayHelper = displayHelper; } /** diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java index 8288fcfb5481..b37010cfc07b 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java @@ -16,6 +16,7 @@ package com.android.systemui.dreams.touch; +import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; @@ -77,6 +78,11 @@ public interface DreamTouchHandler { * Returns the number of currently active sessions. */ int getActiveSessionCount(); + + /** + * Returns the bounds of the display the touch region. + */ + Rect getBounds(); } /** @@ -84,7 +90,7 @@ public interface DreamTouchHandler { * indicating the entire screen should be considered. * @param region A {@link Region} that is passed in to the target entry touch region. */ - default void getTouchInitiationRegion(Region region) { + default void getTouchInitiationRegion(Rect bounds, Region region) { } /** diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 4dd3a4efca87..4fe219de2cac 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -137,7 +137,7 @@ object Flags { * the digits when the clock moves. */ @JvmField - val STEP_CLOCK_ANIMATION = releasedFlag(212, "step_clock_animation") + val STEP_CLOCK_ANIMATION = unreleasedFlag(212, "step_clock_animation", teamfood = true) /** * Migration from the legacy isDozing/dozeAmount paths to the new KeyguardTransitionRepository @@ -414,9 +414,9 @@ object Flags { @JvmField // TODO(b/271428141): Tracking Bug - val ENABLE_LOW_LIGHT_CLOCK_UNDOCKED = unreleasedFlag( + val ENABLE_LOW_LIGHT_CLOCK_UNDOCKED = releasedFlag( 1004, - "enable_low_light_clock_undocked", teamfood = true) + "enable_low_light_clock_undocked") // TODO(b/273509374): Tracking Bug @JvmField @@ -569,10 +569,6 @@ object Flags { val TRACKPAD_GESTURE_COMMON = releasedFlag(1210, "trackpad_gesture_common") // 1300 - screenshots - // TODO(b/254513155): Tracking Bug - @JvmField - val SCREENSHOT_WORK_PROFILE_POLICY = releasedFlag(1301, "screenshot_work_profile_policy") - // TODO(b/264916608): Tracking Bug @JvmField val SCREENSHOT_METADATA = unreleasedFlag(1302, "screenshot_metadata", teamfood = true) @@ -610,6 +606,9 @@ object Flags { val SHARESHEET_SCROLLABLE_IMAGE_PREVIEW = releasedFlag(1504, "sharesheet_scrollable_image_preview") + // TODO(b/274137694) Tracking Bug + val CHOOSER_MIGRATION_ENABLED = unreleasedFlag(1505, "chooser_migration_enabled") + // 1700 - clipboard @JvmField val CLIPBOARD_REMOTE_BEHAVIOR = releasedFlag(1701, "clipboard_remote_behavior") // TODO(b/267162944): Tracking bug diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 5ecc00fb66b5..0825435e9ae5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2690,6 +2690,17 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mInteractionJankMonitor.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION); return; } + if (apps == null || apps.length == 0) { + Slog.e(TAG, "Keyguard exit without a corresponding app to show."); + try { + finishedCallback.onAnimationFinished(); + } catch (RemoteException e) { + Slog.e(TAG, "RemoteException"); + } finally { + mInteractionJankMonitor.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION); + } + return; + } // TODO(bc-unlock): Sample animation, just to apply alpha animation on the app. final SyncRtSurfaceTransactionApplier applier = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt index ae5b79947006..64e2a2cbd396 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.data.repository import android.os.Build +import android.util.Log import com.android.keyguard.ViewMediatorCallback import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -34,6 +35,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach /** * Encapsulates app state for the lock screen primary and alternate bouncer. @@ -231,6 +233,7 @@ constructor( primaryBouncerShow .logDiffsForTable(buffer, "", "PrimaryBouncerShow", false) + .onEach { Log.d(TAG, "Keyguard Bouncer is ${if (it) "showing" else "hiding."}") } .launchIn(applicationScope) primaryBouncerShowingSoon .logDiffsForTable(buffer, "", "PrimaryBouncerShowingSoon", false) @@ -274,5 +277,6 @@ constructor( companion object { private const val NOT_VISIBLE = -1L + private const val TAG = "KeyguardBouncerRepositoryImpl" } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 3c0ec350c5c5..aabd212c1bd3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.merge class KeyguardTransitionInteractor @Inject constructor( - repository: KeyguardTransitionRepository, + private val repository: KeyguardTransitionRepository, ) { /** (any)->GONE transition information */ val anyStateToGoneTransition: Flow<TransitionStep> = @@ -62,10 +62,6 @@ constructor( /** LOCKSCREEN->AOD transition information. */ val lockscreenToAodTransition: Flow<TransitionStep> = repository.transition(LOCKSCREEN, AOD) - /** LOCKSCREEN->PRIMARY_BOUNCER transition information. */ - val mLockscreenToPrimaryBouncerTransition: Flow<TransitionStep> = - repository.transition(LOCKSCREEN, PRIMARY_BOUNCER) - /** LOCKSCREEN->DREAMING transition information. */ val lockscreenToDreamingTransition: Flow<TransitionStep> = repository.transition(LOCKSCREEN, DREAMING) @@ -92,19 +88,39 @@ constructor( lockscreenToAodTransition, ) - /* The last [TransitionStep] with a [TransitionState] of STARTED */ + /** The last [TransitionStep] with a [TransitionState] of STARTED */ val startedKeyguardTransitionStep: Flow<TransitionStep> = repository.transitions.filter { step -> step.transitionState == TransitionState.STARTED } - /* The last [TransitionStep] with a [TransitionState] of CANCELED */ + /** The last [TransitionStep] with a [TransitionState] of CANCELED */ val canceledKeyguardTransitionStep: Flow<TransitionStep> = repository.transitions.filter { step -> step.transitionState == TransitionState.CANCELED } - /* The last [TransitionStep] with a [TransitionState] of FINISHED */ + /** The last [TransitionStep] with a [TransitionState] of FINISHED */ val finishedKeyguardTransitionStep: Flow<TransitionStep> = repository.transitions.filter { step -> step.transitionState == TransitionState.FINISHED } - /* The last completed [KeyguardState] transition */ + /** The last completed [KeyguardState] transition */ val finishedKeyguardState: Flow<KeyguardState> = finishedKeyguardTransitionStep.map { step -> step.to } + + /** + * The amount of transition into or out of the given [KeyguardState]. + * + * The value will be `0` (or close to `0`, due to float point arithmetic) if not in this step or + * `1` when fully in the given state. + */ + fun transitionValue( + state: KeyguardState, + ): Flow<Float> { + return repository.transitions + .filter { it.from == state || it.to == state } + .map { + if (it.from == state) { + 1 - it.value + } else { + it.value + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt index e65c8a16f9e9..77541e931e08 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt @@ -95,8 +95,7 @@ constructor( } val keyguardAuthenticated: Flow<Boolean> = repository.keyguardAuthenticated.filterNotNull() - val show: Flow<Unit> = repository.primaryBouncerShow.filter { it }.map {} - val hide: Flow<Unit> = repository.primaryBouncerShow.filter { !it }.map {} + val isShowing: Flow<Boolean> = repository.primaryBouncerShow val startingToHide: Flow<Unit> = repository.primaryBouncerStartingToHide.filter { it }.map {} val isBackButtonEnabled: Flow<Boolean> = repository.isBackButtonEnabled.filterNotNull() val showMessage: Flow<BouncerShowMessageModel> = repository.showMessage.filterNotNull() diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/SysUiFaceAuthenticateOptions.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/SysUiFaceAuthenticateOptions.kt index a79513ebd867..942cd60db479 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/SysUiFaceAuthenticateOptions.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/SysUiFaceAuthenticateOptions.kt @@ -31,7 +31,6 @@ import android.hardware.face.FaceAuthenticateOptions.AuthenticateReason import android.os.PowerManager import android.os.PowerManager.WAKE_REASON_UNKNOWN import android.util.Log -import com.android.internal.logging.UiEvent import com.android.internal.logging.UiEventLogger import com.android.keyguard.FaceAuthUiEvent @@ -40,11 +39,11 @@ import com.android.keyguard.FaceAuthUiEvent * [FaceAuthenticateOptions]. */ data class SysUiFaceAuthenticateOptions( - val userId: Int, - private val faceAuthUiEvent: UiEventLogger.UiEventEnum, - @PowerManager.WakeReason val wakeReason: Int = WAKE_REASON_UNKNOWN + val userId: Int, + private val faceAuthUiEvent: UiEventLogger.UiEventEnum, + @PowerManager.WakeReason val wakeReason: Int = WAKE_REASON_UNKNOWN ) { - val authenticateReason = setAuthenticateReason(faceAuthUiEvent) + private val authenticateReason = setAuthenticateReason(faceAuthUiEvent) /** * The [FaceAuthUiEvent] for this operation. This method converts the UiEvent to the framework diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt index 5fcf1052d949..468a6b52c5e5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt @@ -109,36 +109,36 @@ object KeyguardBouncerViewBinder { try { viewModel.setBouncerViewDelegate(delegate) launch { - viewModel.show.collect { - // Reset Security Container entirely. - securityContainerController.reinflateViewFlipper { + viewModel.isShowing.collect { isShowing -> + if (isShowing) { // Reset Security Container entirely. - view.visibility = View.VISIBLE + securityContainerController.reinflateViewFlipper { + // Reset Security Container entirely. + view.visibility = View.VISIBLE + securityContainerController.onBouncerVisibilityChanged( + /* isVisible= */ true + ) + securityContainerController.showPrimarySecurityScreen( + /* turningOff= */ false + ) + securityContainerController.appear() + securityContainerController.onResume( + KeyguardSecurityView.SCREEN_ON + ) + } + } else { + view.visibility = View.INVISIBLE securityContainerController.onBouncerVisibilityChanged( - /* isVisible= */ true + /* isVisible= */ false ) - securityContainerController.showPrimarySecurityScreen( - /* turningOff= */ false - ) - securityContainerController.appear() - securityContainerController.onResume(KeyguardSecurityView.SCREEN_ON) + securityContainerController.cancelDismissAction() + securityContainerController.reset() + securityContainerController.onPause() } } } launch { - viewModel.hide.collect { - view.visibility = View.INVISIBLE - securityContainerController.onBouncerVisibilityChanged( - /* isVisible= */ false - ) - securityContainerController.cancelDismissAction() - securityContainerController.reset() - securityContainerController.onPause() - } - } - - launch { viewModel.startingToHide.collect { securityContainerController.onStartingToHide() } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt index 0656c9baa921..9602888ced58 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt @@ -40,11 +40,8 @@ constructor( /** Can the user interact with the view? */ val isInteractable: Flow<Boolean> = interactor.isInteractable - /** Observe whether bouncer is showing. */ - val show: Flow<Unit> = interactor.show - - /** Observe whether bouncer is hiding. */ - val hide: Flow<Unit> = interactor.hide + /** Observe whether bouncer is showing or not. */ + val isShowing: Flow<Boolean> = interactor.isShowing /** Observe whether bouncer is starting to hide. */ val startingToHide: Flow<Unit> = interactor.startingToHide @@ -70,8 +67,8 @@ constructor( /** Observe whether we should update fps is showing. */ val shouldUpdateSideFps: Flow<Unit> = merge( - interactor.hide, - interactor.show, + interactor.isShowing.map {}, + interactor.startingToHide, interactor.startingDisappearAnimation.filterNotNull().map {} ) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt index f08b97695202..ab394428ad8d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt @@ -39,7 +39,6 @@ import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor @@ -69,7 +68,6 @@ import com.android.systemui.util.time.SystemClock import com.android.systemui.util.traceSection import java.io.PrintWriter import java.util.TreeMap -import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.CoroutineScope @@ -95,8 +93,7 @@ constructor( private val mediaHostStatesManager: MediaHostStatesManager, private val activityStarter: ActivityStarter, private val systemClock: SystemClock, - @Main private val mainExecutor: DelayableExecutor, - @Background private val backgroundExecutor: Executor, + @Main executor: DelayableExecutor, private val mediaManager: MediaDataManager, configurationController: ConfigurationController, falsingCollector: FalsingCollector, @@ -254,7 +251,7 @@ constructor( MediaCarouselScrollHandler( mediaCarousel, pageIndicator, - mainExecutor, + executor, this::onSwipeToDismiss, this::updatePageIndicatorLocation, this::updateSeekbarListening, @@ -616,50 +613,10 @@ constructor( MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (existingPlayer == null) { - setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey) - } else { - existingPlayer.bindPlayer(data, key) - MediaPlayerData.addMediaPlayer( - key, - data, - existingPlayer, - systemClock, - isSsReactivated, - debugLogger - ) - val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String() - // In case of recommendations hits. - // Check the playing status of media player and the package name. - // To make sure we scroll to the right app's media player. - if ( - isReorderingAllowed || - shouldScrollToKey && - data.isPlaying == true && - packageName == data.packageName - ) { - reorderAllPlayers(curVisibleMediaKey, key) - } else { - needsReordering = true - } - updatePageIndicator() - mediaCarouselScrollHandler.onPlayersChanged() - mediaFrame.requiresRemeasuring = true - } - return existingPlayer == null - } - - private fun setupNewPlayer( - key: String, - data: MediaData, - isSsReactivated: Boolean, - curVisibleMediaKey: MediaPlayerData.MediaSortKey?, - ) { - backgroundExecutor.execute { - val mediaViewHolder = createMediaViewHolderInBg() - // Add the new player in the main thread. - mainExecutor.execute { val newPlayer = mediaControlPanelFactory.get() - newPlayer.attachPlayer(mediaViewHolder) + newPlayer.attachPlayer( + MediaViewHolder.create(LayoutInflater.from(context), mediaContent) + ) newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( @@ -689,16 +646,36 @@ constructor( } else { needsReordering = true } - updatePageIndicator() - mediaCarouselScrollHandler.onPlayersChanged() - mediaFrame.requiresRemeasuring = true + } else { + existingPlayer.bindPlayer(data, key) + MediaPlayerData.addMediaPlayer( + key, + data, + existingPlayer, + systemClock, + isSsReactivated, + debugLogger + ) + val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String() + // In case of recommendations hits. + // Check the playing status of media player and the package name. + // To make sure we scroll to the right app's media player. + if ( + isReorderingAllowed || + shouldScrollToKey && + data.isPlaying == true && + packageName == data.packageName + ) { + reorderAllPlayers(curVisibleMediaKey, key) + } else { + needsReordering = true + } } + updatePageIndicator() + mediaCarouselScrollHandler.onPlayersChanged() + mediaFrame.requiresRemeasuring = true + return existingPlayer == null } - } - - private fun createMediaViewHolderInBg(): MediaViewHolder { - return MediaViewHolder.create(LayoutInflater.from(context), mediaContent) - } private fun addSmartspaceMediaRecommendations( key: String, @@ -732,14 +709,15 @@ constructor( debugLogger.logPotentialMemoryLeak(existingSmartspaceMediaKey) } } + val newRecs = mediaControlPanelFactory.get() - val recommendationViewHolder = + newRecs.attachRecommendation( RecommendationViewHolder.create( LayoutInflater.from(context), mediaContent, mediaFlags.isRecommendationCardUpdateEnabled() ) - newRecs.attachRecommendation(recommendationViewHolder) + ) newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( @@ -763,6 +741,17 @@ constructor( reorderAllPlayers(curVisibleMediaKey) updatePageIndicator() mediaFrame.requiresRemeasuring = true + // Check postcondition: mediaContent should have the same number of children as there + // are + // elements in mediaPlayers. + if (MediaPlayerData.players().size != mediaContent.childCount) { + Log.e( + TAG, + "Size of players list and number of views in carousel are out of sync. " + + "Players size is ${MediaPlayerData.players().size}. " + + "View count is ${mediaContent.childCount}." + ) + } } fun removePlayer( diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt index e10d74db6333..54237ce7cf25 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt @@ -317,13 +317,16 @@ constructor( /** * Returns the amount of translationY of the media container, during the current guided - * transformation, if running. If there is no guided transformation running, it will return 0. + * transformation, if running. If there is no guided transformation running, it will return -1. */ fun getGuidedTransformationTranslationY(): Int { if (!isCurrentlyInGuidedTransformation()) { return -1 } - val startHost = getHost(previousLocation) ?: return 0 + val startHost = getHost(previousLocation) + if (startHost == null || !startHost.visible) { + return 0 + } return targetBounds.top - startHost.currentBounds.top } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java index a174b459272f..19b32e93274b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java @@ -117,7 +117,7 @@ public class MediaOutputDialog extends MediaOutputBaseDialog { @Override public CharSequence getStopButtonText() { - int resId = R.string.keyboard_key_media_stop; + int resId = R.string.media_output_dialog_button_stop_casting; if (isBroadcastSupported() && mMediaOutputController.isPlaying() && !mMediaOutputController.isBluetoothLeBroadcastEnabled()) { resId = R.string.media_output_broadcast; diff --git a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt index ff7c9015eef4..33b3087678e1 100644 --- a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt @@ -19,13 +19,20 @@ package com.android.systemui.multishade.domain.interactor import android.content.Context import android.view.MotionEvent import android.view.ViewConfiguration +import com.android.systemui.classifier.Classifier import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.multishade.shared.math.isZero import com.android.systemui.multishade.shared.model.ProxiedInputModel +import com.android.systemui.plugins.FalsingManager import javax.inject.Inject import kotlin.math.abs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** @@ -39,15 +46,27 @@ class MultiShadeMotionEventInteractor constructor( @Application private val applicationContext: Context, @Application private val applicationScope: CoroutineScope, - private val interactor: MultiShadeInteractor, + private val multiShadeInteractor: MultiShadeInteractor, + keyguardTransitionInteractor: KeyguardTransitionInteractor, + private val bouncerInteractor: PrimaryBouncerInteractor, + private val falsingManager: FalsingManager, ) { private val isAnyShadeExpanded: StateFlow<Boolean> = - interactor.isAnyShadeExpanded.stateIn( + multiShadeInteractor.isAnyShadeExpanded.stateIn( scope = applicationScope, started = SharingStarted.Eagerly, initialValue = false, ) + private val isBouncerShowing: StateFlow<Boolean> = + keyguardTransitionInteractor + .transitionValue(state = KeyguardState.PRIMARY_BOUNCER) + .map { !it.isZero() } + .stateIn( + scope = applicationScope, + started = SharingStarted.Eagerly, + initialValue = false, + ) private var interactionState: InteractionState? = null @@ -65,6 +84,10 @@ constructor( return false } + if (isBouncerShowing.value) { + return false + } + return when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { // Record where the pointer was placed and which pointer it was. @@ -75,7 +98,7 @@ constructor( currentY = event.y, pointerId = event.getPointerId(0), isDraggingHorizontally = false, - isDraggingVertically = false, + draggedVertically = Dragged.NONE, ) false @@ -85,16 +108,25 @@ constructor( val pointerIndex = event.findPointerIndex(it.pointerId) val currentX = event.getX(pointerIndex) val currentY = event.getY(pointerIndex) - if (!it.isDraggingHorizontally && !it.isDraggingVertically) { - val xDistanceTravelled = abs(currentX - it.initialX) - val yDistanceTravelled = abs(currentY - it.initialY) + if (!it.isDraggingHorizontally && it.draggedVertically == Dragged.NONE) { + val xDistanceTravelled = currentX - it.initialX + val yDistanceTravelled = currentY - it.initialY val touchSlop = ViewConfiguration.get(applicationContext).scaledTouchSlop interactionState = when { - yDistanceTravelled > touchSlop -> - it.copy(isDraggingVertically = true) - xDistanceTravelled > touchSlop -> - it.copy(isDraggingHorizontally = true) + abs(yDistanceTravelled) > touchSlop -> + it.copy( + draggedVertically = + if (yDistanceTravelled > 0) { + Dragged.SHADE + } else { + Dragged.BOUNCER + } + ) + abs(xDistanceTravelled) > touchSlop -> + it.copy( + isDraggingHorizontally = true, + ) else -> interactionState } } @@ -124,7 +156,7 @@ constructor( return when (event.actionMasked) { MotionEvent.ACTION_MOVE -> { interactionState?.let { - if (it.isDraggingVertically) { + if (it.draggedVertically != Dragged.NONE) { val pointerIndex = event.findPointerIndex(it.pointerId) val previousY = it.currentY val currentY = event.getY(pointerIndex) @@ -133,32 +165,48 @@ constructor( currentY = currentY, ) - val yDragAmountPx = currentY - previousY - if (yDragAmountPx != 0f) { - interactor.sendProxiedInput( - ProxiedInputModel.OnDrag( - xFraction = event.x / viewWidthPx, - yDragAmountPx = yDragAmountPx, - ) - ) + when (it.draggedVertically) { + Dragged.SHADE -> { + val yDragAmountPx = currentY - previousY + + if (yDragAmountPx != 0f) { + multiShadeInteractor.sendProxiedInput( + ProxiedInputModel.OnDrag( + xFraction = event.x / viewWidthPx, + yDragAmountPx = yDragAmountPx, + ) + ) + } + true + } + Dragged.BOUNCER -> { + bouncerInteractor.show(isScrimmed = true) + false + } + else -> false } + } else { + false } } - - true + ?: false } MotionEvent.ACTION_UP -> { - if (interactionState.isDraggingVertically()) { + if (interactionState?.draggedVertically == Dragged.SHADE) { // We finished dragging. Record that so the multi-shade framework can issue a // fling, if the velocity reached in the drag was high enough, for example. - interactor.sendProxiedInput(ProxiedInputModel.OnDragEnd) + multiShadeInteractor.sendProxiedInput(ProxiedInputModel.OnDragEnd) + + if (falsingManager.isFalseTouch(Classifier.SHADE_DRAG)) { + multiShadeInteractor.collapseAll() + } } interactionState = null true } MotionEvent.ACTION_CANCEL -> { - if (interactionState.isDraggingVertically()) { + if (interactionState?.draggedVertically == Dragged.SHADE) { // Our drag gesture was canceled by the system. This happens primarily in one of // two occasions: (a) the parent view has decided to intercept the gesture // itself and/or route it to a different child view or (b) the pointer has @@ -166,7 +214,15 @@ constructor( // we pass the cancellation event to the multi-shade framework to record it. // Doing that allows the multi-shade framework to know that the gesture ended to // allow new gestures to be accepted. - interactor.sendProxiedInput(ProxiedInputModel.OnDragCancel) + multiShadeInteractor.sendProxiedInput(ProxiedInputModel.OnDragCancel) + + if (falsingManager.isFalseTouch(Classifier.SHADE_DRAG)) { + multiShadeInteractor.collapseAll() + } + } else if (interactionState?.draggedVertically == Dragged.BOUNCER) { + if (falsingManager.isFalseTouch(Classifier.BOUNCER_UNLOCK)) { + bouncerInteractor.hide() + } } interactionState = null @@ -181,11 +237,23 @@ constructor( val initialY: Float, val currentY: Float, val pointerId: Int, + /** Whether the current gesture is dragging horizontally. */ val isDraggingHorizontally: Boolean, - val isDraggingVertically: Boolean, + /** The UI component that is being dragged vertically, if any. */ + val draggedVertically: Dragged, ) + /** Enumerates the UI components that can be dragged by the user. */ + private enum class Dragged { + /** The bouncer is being dragged by the user. */ + BOUNCER, + /** A shade is being dragged by the user. */ + SHADE, + /** No UI component is being dragged by the user. */ + NONE, + } + private fun InteractionState?.isDraggingVertically(): Boolean { - return this?.isDraggingVertically == true + return this?.draggedVertically != Dragged.NONE } } diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt index 93ed8591e738..d951ea5bf3db 100644 --- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt +++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt @@ -18,6 +18,7 @@ package com.android.systemui.notetask +import android.app.ActivityManager import android.app.KeyguardManager import android.app.admin.DevicePolicyManager import android.app.role.OnRoleHoldersChangedListener @@ -40,6 +41,7 @@ import com.android.systemui.notetask.NoteTaskRoleManagerExt.createNoteShortcutIn import com.android.systemui.notetask.NoteTaskRoleManagerExt.getDefaultRoleHolderAsUser import com.android.systemui.notetask.shortcut.CreateNoteTaskShortcutActivity import com.android.systemui.settings.UserTracker +import com.android.systemui.shared.system.ActivityManagerKt.isInForeground import com.android.systemui.util.kotlin.getOrNull import com.android.wm.shell.bubbles.Bubble import com.android.wm.shell.bubbles.Bubbles @@ -67,6 +69,7 @@ constructor( private val optionalBubbles: Optional<Bubbles>, private val userManager: UserManager, private val keyguardManager: KeyguardManager, + private val activityManager: ActivityManager, @NoteTaskEnabledKey private val isEnabled: Boolean, private val devicePolicyManager: DevicePolicyManager, private val userTracker: UserTracker, @@ -151,9 +154,13 @@ constructor( logDebug { "onShowNoteTask - opened as app bubble: $info" } } is NoteTaskLaunchMode.Activity -> { - context.startActivityAsUser(intent, user) - eventLogger.logNoteTaskOpened(info) - logDebug { "onShowNoteTask - opened as activity: $info" } + if (activityManager.isInForeground(info.packageName)) { + logDebug { "onShowNoteTask - already opened as activity: $info" } + } else { + context.startActivityAsUser(intent, user) + eventLogger.logNoteTaskOpened(info) + logDebug { "onShowNoteTask - opened as activity: $info" } + } } } logDebug { "onShowNoteTask - success: $info" } diff --git a/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt index 8aed9958a7a2..2da5b7621723 100644 --- a/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt @@ -18,6 +18,11 @@ package com.android.systemui.notetask.quickaffordance import android.content.Context import android.hardware.input.InputSettings +import android.os.Build +import android.os.UserManager +import android.util.Log +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.R import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.ContentDescription @@ -39,6 +44,7 @@ import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach class NoteTaskQuickAffordanceConfig @Inject @@ -46,6 +52,8 @@ constructor( context: Context, private val controller: NoteTaskController, private val stylusManager: StylusManager, + private val keyguardMonitor: KeyguardUpdateMonitor, + private val userManager: UserManager, private val lazyRepository: Lazy<KeyguardQuickAffordanceRepository>, @NoteTaskEnabledKey private val isEnabled: Boolean, ) : KeyguardQuickAffordanceConfig { @@ -61,17 +69,27 @@ constructor( // Due to a dependency cycle with KeyguardQuickAffordanceRepository, we need to lazily access // the repository when lockScreenState is accessed for the first time. override val lockScreenState by lazy { - val stylusEverUsedFlow = createStylusEverUsedFlow(context, stylusManager) - val configSelectedFlow = createConfigSelectedFlow(lazyRepository.get(), key) - combine(configSelectedFlow, stylusEverUsedFlow) { isSelected, isStylusEverUsed -> - if (isEnabled && (isSelected || isStylusEverUsed)) { - val contentDescription = ContentDescription.Resource(pickerNameResourceId) - val icon = Icon.Resource(pickerIconResourceId, contentDescription) - LockScreenState.Visible(icon) - } else { - LockScreenState.Hidden + val repository = lazyRepository.get() + val configSelectedFlow = repository.createConfigSelectedFlow(key) + val stylusEverUsedFlow = stylusManager.createStylusEverUsedFlow(context) + val userUnlockedFlow = userManager.createUserUnlockedFlow(keyguardMonitor) + combine(userUnlockedFlow, stylusEverUsedFlow, configSelectedFlow) { + isUserUnlocked, + isStylusEverUsed, + isConfigSelected -> + logDebug { "lockScreenState:isUserUnlocked=$isUserUnlocked" } + logDebug { "lockScreenState:isStylusEverUsed=$isStylusEverUsed" } + logDebug { "lockScreenState:isConfigSelected=$isConfigSelected" } + + if (isEnabled && isUserUnlocked && (isConfigSelected || isStylusEverUsed)) { + val contentDescription = ContentDescription.Resource(pickerNameResourceId) + val icon = Icon.Resource(pickerIconResourceId, contentDescription) + LockScreenState.Visible(icon) + } else { + LockScreenState.Hidden + } } - } + .onEach { state -> logDebug { "lockScreenState=$state" } } } override suspend fun getPickerScreenState() = @@ -82,27 +100,40 @@ constructor( } override fun onTriggered(expandable: Expandable?): OnTriggeredResult { - controller.showNoteTask( - entryPoint = NoteTaskEntryPoint.QUICK_AFFORDANCE, - ) + controller.showNoteTask(entryPoint = NoteTaskEntryPoint.QUICK_AFFORDANCE) return OnTriggeredResult.Handled } } -private fun createStylusEverUsedFlow(context: Context, stylusManager: StylusManager) = - callbackFlow { - trySendBlocking(InputSettings.isStylusEverUsed(context)) - val callback = - object : StylusManager.StylusCallback { - override fun onStylusFirstUsed() { - trySendBlocking(InputSettings.isStylusEverUsed(context)) - } +private fun UserManager.createUserUnlockedFlow(monitor: KeyguardUpdateMonitor) = callbackFlow { + trySendBlocking(isUserUnlocked) + val callback = + object : KeyguardUpdateMonitorCallback() { + override fun onUserUnlocked() { + trySendBlocking(isUserUnlocked) } - stylusManager.registerCallback(callback) - awaitClose { stylusManager.unregisterCallback(callback) } - } + } + monitor.registerCallback(callback) + awaitClose { monitor.removeCallback(callback) } +} -private fun createConfigSelectedFlow(repository: KeyguardQuickAffordanceRepository, key: String) = - repository.selections.map { selected -> +private fun StylusManager.createStylusEverUsedFlow(context: Context) = callbackFlow { + trySendBlocking(InputSettings.isStylusEverUsed(context)) + val callback = + object : StylusManager.StylusCallback { + override fun onStylusFirstUsed() { + trySendBlocking(InputSettings.isStylusEverUsed(context)) + } + } + registerCallback(callback) + awaitClose { unregisterCallback(callback) } +} + +private fun KeyguardQuickAffordanceRepository.createConfigSelectedFlow(key: String) = + selections.map { selected -> selected.values.flatten().any { selectedConfig -> selectedConfig.key == key } } + +private inline fun Any.logDebug(message: () -> String) { + if (Build.IS_DEBUGGABLE) Log.d(this::class.java.simpleName, message()) +} diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java index 7a42642f2667..c2c1306d2a32 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java @@ -772,9 +772,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { mSaverConfirmation.dismiss(); } // Also close the notification shade, if it's open. - mBroadcastSender.sendBroadcast( - new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) - .setFlags(Intent.FLAG_RECEIVER_FOREGROUND)); + mBroadcastSender.closeSystemDialogs(); final Uri uri = Uri.parse(getURL()); Context context = widget.getContext(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index de1137e48074..3090b793552f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -310,9 +310,15 @@ open class QSTileViewImpl @JvmOverloads constructor( } override fun onStateChanged(state: QSTile.State) { - post { - handleStateChanged(state) - } + // We cannot use the handler here because sometimes, the views are not attached (if they + // are in a page that the ViewPager hasn't attached). Instead, we use a runnable where + // all its instances are `equal` to each other, so they can be used to remove them from the + // queue. + // This means that at any given time there's at most one enqueued runnable to change state. + // However, as we only ever care about the last state posted, this is fine. + val runnable = StateChangeRunnable(state.copy()) + removeCallbacks(runnable) + post(runnable) } override fun getDetailY(): Int { @@ -650,6 +656,23 @@ open class QSTileViewImpl @JvmOverloads constructor( secondaryLabel.currentTextColor, chevronView.imageTintList?.defaultColor ?: 0 ) + + inner class StateChangeRunnable(private val state: QSTile.State) : Runnable { + override fun run() { + handleStateChanged(state) + } + + // We want all instances of this runnable to be equal to each other, so they can be used to + // remove previous instances from the Handler/RunQueue of this view + override fun equals(other: Any?): Boolean { + return other is StateChangeRunnable + } + + // This makes sure that all instances have the same hashcode (because they are `equal`) + override fun hashCode(): Int { + return StateChangeRunnable::class.hashCode() + } + } } fun constrainSquishiness(squish: Float): Float { diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 0748bcbf020c..c28a40a91378 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -140,7 +140,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private final Handler mHandler; private final Lazy<NavigationBarController> mNavBarControllerLazy; private final NotificationShadeWindowController mStatusBarWinController; - private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser; + private final Runnable mConnectionRunnable = () -> + internalConnectToCurrentUser("runnable: startConnectionToCurrentUser"); private final ComponentName mRecentsComponentName; private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>(); private final Intent mQuickStepIntent; @@ -406,7 +407,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis // Failed to link to death (process may have died between binding and connecting), // just unbind the service for now and retry again Log.e(TAG_OPS, "Lost connection to launcher service", e); - disconnectFromLauncherService(); + disconnectFromLauncherService("Lost connection to launcher service"); retryConnectionWithBackoff(); return; } @@ -501,7 +502,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis @Override public void onUserChanged(int newUser, @NonNull Context userContext) { mConnectionBackoffAttempts = 0; - internalConnectToCurrentUser(); + internalConnectToCurrentUser("User changed"); } }; @@ -716,12 +717,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis if (mHandler.getLooper() != Looper.myLooper()) { mHandler.post(mConnectionRunnable); } else { - internalConnectToCurrentUser(); + internalConnectToCurrentUser("startConnectionToCurrentUser"); } } - private void internalConnectToCurrentUser() { - disconnectFromLauncherService(); + private void internalConnectToCurrentUser(String reason) { + disconnectFromLauncherService(reason); // If user has not setup yet or already connected, do not try to connect if (!isEnabled()) { @@ -783,7 +784,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis return mOverviewProxy; } - private void disconnectFromLauncherService() { + private void disconnectFromLauncherService(String disconnectReason) { + Log.d(TAG_OPS, "disconnectFromLauncherService bound?: " + mBound + + " currentProxy: " + mOverviewProxy + " disconnectReason: " + disconnectReason); if (mBound) { // Always unbind the service (ie. if called through onNullBinding or onBindingDied) mContext.unbindService(mOverviewServiceConnection); @@ -1047,6 +1050,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mContext.unregisterReceiver(mLauncherStateChangedReceiver); mIsEnabled = false; mHandler.removeCallbacks(mConnectionRunnable); - disconnectFromLauncherService(); + disconnectFromLauncherService("Shutdown for test"); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 047762662aab..4349bd71f670 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -205,7 +205,7 @@ public class RecordingService extends Service implements ScreenMediaRecorderList }, false, false); // Close quick shade - sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + closeSystemDialogs(); break; } return Service.START_STICKY; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java b/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java index 7cfe2327f992..8c01bae43c3d 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java @@ -39,7 +39,6 @@ import androidx.exifinterface.media.ExifInterface; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.google.common.util.concurrent.ListenableFuture; @@ -294,8 +293,7 @@ public class ImageExporter { final ContentValues values = createMetadata(time, format, fileName); Uri baseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - if (flags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY) - && UserHandle.myUserId() != owner.getIdentifier()) { + if (UserHandle.myUserId() != owner.getIdentifier()) { baseUri = ContentProvider.maybeAddUserId(baseUri, owner.getIdentifier()); } Uri uri = resolver.insert(baseUri, values); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java index 02a60ad60fa1..2312c705cd6e 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java @@ -47,7 +47,6 @@ import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.screenshot.ScrollCaptureController.LongScreenshot; import com.android.systemui.settings.UserTracker; @@ -335,8 +334,7 @@ public class LongScreenshotActivity extends Activity { } private void doEdit(Uri uri) { - if (mFeatureFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY) && mScreenshotUserHandle - != Process.myUserHandle()) { + if (mScreenshotUserHandle != Process.myUserHandle()) { // TODO: Fix transition for work profile. Omitting it in the meantime. mActionExecutor.launchIntentAsync( ActionIntentCreator.INSTANCE.createEditIntent(uri, this), @@ -365,21 +363,9 @@ public class LongScreenshotActivity extends Activity { } private void doShare(Uri uri) { - if (mFeatureFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - Intent shareIntent = ActionIntentCreator.INSTANCE.createShareIntent(uri); - mActionExecutor.launchIntentAsync(shareIntent, null, - mScreenshotUserHandle.getIdentifier(), false); - } else { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("image/png"); - intent.putExtra(Intent.EXTRA_STREAM, uri); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK - | Intent.FLAG_GRANT_READ_URI_PERMISSION); - Intent sharingChooserIntent = Intent.createChooser(intent, null) - .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - - startActivityAsUser(sharingChooserIntent, mUserTracker.getUserHandle()); - } + Intent shareIntent = ActionIntentCreator.INSTANCE.createShareIntent(uri); + mActionExecutor.launchIntentAsync(shareIntent, null, + mScreenshotUserHandle.getIdentifier(), false); } private void onClicked(View v) { @@ -421,8 +407,7 @@ public class LongScreenshotActivity extends Activity { mOutputBitmap = renderBitmap(drawable, bounds); ListenableFuture<ImageExporter.Result> exportFuture = mImageExporter.export( mBackgroundExecutor, UUID.randomUUID(), mOutputBitmap, ZonedDateTime.now(), - mFeatureFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY) - ? mScreenshotUserHandle : Process.myUserHandle()); + mScreenshotUserHandle); exportFuture.addListener(() -> onExportCompleted(action, exportFuture), mUiExecutor); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt index ad66514c689c..b4ffabd78b8a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt @@ -47,48 +47,43 @@ constructor( // Minimal implementation for use when Flags.SCREENSHOT_METADATA isn't turned on. fun onScreenshotTaken(userHandle: UserHandle) { - if (featureFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - val workProfileData = workProfileMessageController.onScreenshotTaken(userHandle) - if (workProfileData != null) { - workProfileFirstRunView.visibility = View.VISIBLE - detectionNoticeView.visibility = View.GONE + val workProfileData = workProfileMessageController.onScreenshotTaken(userHandle) + if (workProfileData != null) { + workProfileFirstRunView.visibility = View.VISIBLE + detectionNoticeView.visibility = View.GONE - workProfileMessageController.populateView( - workProfileFirstRunView, - workProfileData, - this::animateOutMessageContainer - ) - animateInMessageContainer() - } + workProfileMessageController.populateView( + workProfileFirstRunView, + workProfileData, + this::animateOutMessageContainer + ) + animateInMessageContainer() } } fun onScreenshotTaken(screenshot: ScreenshotData) { - if (featureFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - val workProfileData = - workProfileMessageController.onScreenshotTaken(screenshot.userHandle) - var notifiedApps: List<CharSequence> = listOf() - if (featureFlags.isEnabled(Flags.SCREENSHOT_DETECTION)) { - notifiedApps = screenshotDetectionController.maybeNotifyOfScreenshot(screenshot) - } + val workProfileData = workProfileMessageController.onScreenshotTaken(screenshot.userHandle) + var notifiedApps: List<CharSequence> = listOf() + if (featureFlags.isEnabled(Flags.SCREENSHOT_DETECTION)) { + notifiedApps = screenshotDetectionController.maybeNotifyOfScreenshot(screenshot) + } - // If work profile first run needs to show, bias towards that, otherwise show screenshot - // detection notification if needed. - if (workProfileData != null) { - workProfileFirstRunView.visibility = View.VISIBLE - detectionNoticeView.visibility = View.GONE - workProfileMessageController.populateView( - workProfileFirstRunView, - workProfileData, - this::animateOutMessageContainer - ) - animateInMessageContainer() - } else if (notifiedApps.isNotEmpty()) { - detectionNoticeView.visibility = View.VISIBLE - workProfileFirstRunView.visibility = View.GONE - screenshotDetectionController.populateView(detectionNoticeView, notifiedApps) - animateInMessageContainer() - } + // If work profile first run needs to show, bias towards that, otherwise show screenshot + // detection notification if needed. + if (workProfileData != null) { + workProfileFirstRunView.visibility = View.VISIBLE + detectionNoticeView.visibility = View.GONE + workProfileMessageController.populateView( + workProfileFirstRunView, + workProfileData, + this::animateOutMessageContainer + ) + animateInMessageContainer() + } else if (notifiedApps.isNotEmpty()) { + detectionNoticeView.visibility = View.VISIBLE + workProfileFirstRunView.visibility = View.GONE + screenshotDetectionController.populateView(detectionNoticeView, notifiedApps) + animateInMessageContainer() } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt index 4db48ac89e2d..c0d807a78e90 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt @@ -23,7 +23,6 @@ import com.android.internal.util.ScreenshotRequest import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags.SCREENSHOT_WORK_PROFILE_POLICY import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import java.util.function.Consumer @@ -57,9 +56,7 @@ class RequestProcessor @Inject constructor( // Whenever displayContentInfo is fetched, the topComponent is also populated // regardless of the managed profile status. - if (request.type != TAKE_SCREENSHOT_PROVIDED_IMAGE && - flags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY) - ) { + if (request.type != TAKE_SCREENSHOT_PROVIDED_IMAGE) { val info = policy.findPrimaryContent(policy.getDefaultDisplayId()) Log.d(TAG, "findPrimaryContent: $info") @@ -118,9 +115,7 @@ class RequestProcessor @Inject constructor( // Whenever displayContentInfo is fetched, the topComponent is also populated // regardless of the managed profile status. - if (screenshot.type != TAKE_SCREENSHOT_PROVIDED_IMAGE && - flags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY) - ) { + if (screenshot.type != TAKE_SCREENSHOT_PROVIDED_IMAGE) { val info = policy.findPrimaryContent(policy.getDefaultDisplayId()) Log.d(TAG, "findPrimaryContent: $info") result.taskId = info.taskId diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java index bf5fbd223186..efd79d737f71 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java @@ -49,7 +49,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition; import com.google.common.util.concurrent.ListenableFuture; @@ -121,16 +120,13 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { } // TODO: move to constructor / from ScreenshotRequest final UUID requestId = UUID.randomUUID(); - final UserHandle user = mFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY) - ? mParams.owner : getUserHandleOfForegroundApplication(mContext); Thread.currentThread().setPriority(Thread.MAX_PRIORITY); Bitmap image = mParams.image; mScreenshotId = String.format(SCREENSHOT_ID_TEMPLATE, requestId); - boolean savingToOtherUser = mFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY) - && (user != Process.myUserHandle()); + boolean savingToOtherUser = mParams.owner != Process.myUserHandle(); // Smart actions don't yet work for cross-user saves. boolean smartActionsEnabled = !savingToOtherUser && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, @@ -141,7 +137,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { // Since Quick Share target recommendation does not rely on image URL, it is // queried and surfaced before image compress/export. Action intent would not be // used, because it does not contain image URL. - queryQuickShareAction(image, user); + queryQuickShareAction(image, mParams.owner); } // Call synchronously here since already on a background thread. @@ -156,7 +152,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { mScreenshotSmartActions.getSmartActionsFuture( mScreenshotId, uri, image, mSmartActionsProvider, ScreenshotSmartActionType.REGULAR_SMART_ACTIONS, - smartActionsEnabled, user); + smartActionsEnabled, mParams.owner); List<Notification.Action> smartActions = new ArrayList<>(); if (smartActionsEnabled) { int timeoutMs = DeviceConfig.getInt( @@ -172,7 +168,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { } mImageData.uri = uri; - mImageData.owner = user; + mImageData.owner = mParams.owner; mImageData.smartActions = smartActions; mImageData.shareTransition = createShareAction(mContext, mContext.getResources(), uri, smartActionsEnabled); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index 7ad594ee87ac..b2ae4a021f2c 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -19,7 +19,6 @@ package com.android.systemui.screenshot; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; -import static com.android.systemui.flags.Flags.SCREENSHOT_WORK_PROFILE_POLICY; import static com.android.systemui.screenshot.LogConfig.DEBUG_ANIM; import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK; import static com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS; @@ -471,16 +470,12 @@ public class ScreenshotController { } prepareAnimation(screenshot.getScreenBounds(), showFlash, () -> { - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - mMessageContainerController.onScreenshotTaken(screenshot); - } + mMessageContainerController.onScreenshotTaken(screenshot); }); - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - mScreenshotView.badgeScreenshot(mContext.getPackageManager().getUserBadgedIcon( - mContext.getDrawable(R.drawable.overlay_badge_background), - screenshot.getUserHandle())); - } + mScreenshotView.badgeScreenshot(mContext.getPackageManager().getUserBadgedIcon( + mContext.getDrawable(R.drawable.overlay_badge_background), + screenshot.getUserHandle())); mScreenshotView.setScreenshot(screenshot); if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && screenshot.getTaskId() >= 0) { @@ -505,8 +500,7 @@ public class ScreenshotController { void prepareViewForNewScreenshot(ScreenshotData screenshot, String oldPackageName) { withWindowAttached(() -> { - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY) - && mUserManager.isManagedProfile(screenshot.getUserHandle().getIdentifier())) { + if (mUserManager.isManagedProfile(screenshot.getUserHandle().getIdentifier())) { mScreenshotView.announceForAccessibility(mContext.getResources().getString( R.string.screenshot_saving_work_profile_title)); } else { @@ -640,9 +634,7 @@ public class ScreenshotController { // Inflate the screenshot layout mScreenshotView = (ScreenshotView) LayoutInflater.from(mContext).inflate(R.layout.screenshot, null); - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - mMessageContainerController.setView(mScreenshotView); - } + mMessageContainerController.setView(mScreenshotView); mScreenshotView.addOnAttachStateChangeListener( new View.OnAttachStateChangeListener() { @Override @@ -740,8 +732,7 @@ public class ScreenshotController { private void saveScreenshot(Bitmap screenshot, Consumer<Uri> finisher, Rect screenRect, Insets screenInsets, ComponentName topComponent, boolean showFlash, UserHandle owner) { withWindowAttached(() -> { - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY) - && mUserManager.isManagedProfile(owner.getIdentifier())) { + if (mUserManager.isManagedProfile(owner.getIdentifier())) { mScreenshotView.announceForAccessibility(mContext.getResources().getString( R.string.screenshot_saving_work_profile_title)); } else { @@ -793,15 +784,11 @@ public class ScreenshotController { attachWindow(); prepareAnimation(screenRect, showFlash, () -> { - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - mMessageContainerController.onScreenshotTaken(owner); - } + mMessageContainerController.onScreenshotTaken(owner); }); - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - mScreenshotView.badgeScreenshot(mContext.getPackageManager().getUserBadgedIcon( - mContext.getDrawable(R.drawable.overlay_badge_background), owner)); - } + mScreenshotView.badgeScreenshot(mContext.getPackageManager().getUserBadgedIcon( + mContext.getDrawable(R.drawable.overlay_badge_background), owner)); mScreenshotView.setScreenshot(mScreenBitmap, screenInsets); if (DEBUG_WINDOW) { Log.d(TAG, "setContentView: " + mScreenshotView); @@ -959,7 +946,7 @@ public class ScreenshotController { transitionDestination, onTransitionEnd, longScreenshot); // TODO: Do this via ActionIntentExecutor instead. - mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + mContext.closeSystemDialogs(); } ); @@ -1274,8 +1261,7 @@ public class ScreenshotController { R.string.screenshot_failed_to_save_text); } else { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED, 0, mPackageName); - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY) - && mUserManager.isManagedProfile(imageData.owner.getIdentifier())) { + if (mUserManager.isManagedProfile(imageData.owner.getIdentifier())) { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED_TO_WORK_PROFILE, 0, mPackageName); } @@ -1283,13 +1269,8 @@ public class ScreenshotController { } private boolean isUserSetupComplete(UserHandle owner) { - if (mFlags.isEnabled(SCREENSHOT_WORK_PROFILE_POLICY)) { - return Settings.Secure.getInt(mContext.createContextAsUser(owner, 0) - .getContentResolver(), SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1; - } else { - return Settings.Secure.getInt(mContext.getContentResolver(), - SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1; - } + return Settings.Secure.getInt(mContext.createContextAsUser(owner, 0) + .getContentResolver(), SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1; } /** diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index 80f2717f27c3..093c09fff995 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -36,7 +36,6 @@ import android.animation.ValueAnimator; import android.app.ActivityManager; import android.app.BroadcastOptions; import android.app.Notification; -import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; @@ -91,7 +90,6 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; -import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.QuickStepContract; @@ -798,49 +796,36 @@ public class ScreenshotView extends FrameLayout implements void setChipIntents(ScreenshotController.SavedImageData imageData) { mShareChip.setOnClickListener(v -> { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED, 0, mPackageName); - if (mFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - prepareSharedTransition(); - - Intent shareIntent; - if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && mScreenshotData != null - && mScreenshotData.getContextUrl() != null) { - shareIntent = ActionIntentCreator.INSTANCE.createShareIntentWithExtraText( - imageData.uri, mScreenshotData.getContextUrl().toString()); - } else { - shareIntent = ActionIntentCreator.INSTANCE.createShareIntentWithSubject( - imageData.uri, imageData.subject); - } - mActionExecutor.launchIntentAsync(shareIntent, - imageData.shareTransition.get().bundle, - imageData.owner.getIdentifier(), false); + prepareSharedTransition(); + + Intent shareIntent; + if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && mScreenshotData != null + && mScreenshotData.getContextUrl() != null) { + shareIntent = ActionIntentCreator.INSTANCE.createShareIntentWithExtraText( + imageData.uri, mScreenshotData.getContextUrl().toString()); } else { - startSharedTransition(imageData.shareTransition.get()); + shareIntent = ActionIntentCreator.INSTANCE.createShareIntentWithSubject( + imageData.uri, imageData.subject); } + mActionExecutor.launchIntentAsync(shareIntent, + imageData.shareTransition.get().bundle, + imageData.owner.getIdentifier(), false); }); mEditChip.setOnClickListener(v -> { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED, 0, mPackageName); - if (mFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - prepareSharedTransition(); - mActionExecutor.launchIntentAsync( - ActionIntentCreator.INSTANCE.createEditIntent(imageData.uri, mContext), - imageData.editTransition.get().bundle, - imageData.owner.getIdentifier(), true); - } else { - startSharedTransition(imageData.editTransition.get()); - } + prepareSharedTransition(); + mActionExecutor.launchIntentAsync( + ActionIntentCreator.INSTANCE.createEditIntent(imageData.uri, mContext), + imageData.editTransition.get().bundle, + imageData.owner.getIdentifier(), true); }); mScreenshotPreview.setOnClickListener(v -> { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED, 0, mPackageName); - if (mFlags.isEnabled(Flags.SCREENSHOT_WORK_PROFILE_POLICY)) { - prepareSharedTransition(); - mActionExecutor.launchIntentAsync( - ActionIntentCreator.INSTANCE.createEditIntent(imageData.uri, mContext), - imageData.editTransition.get().bundle, - imageData.owner.getIdentifier(), true); - } else { - startSharedTransition( - imageData.editTransition.get()); - } + prepareSharedTransition(); + mActionExecutor.launchIntentAsync( + ActionIntentCreator.INSTANCE.createEditIntent(imageData.uri, mContext), + imageData.editTransition.get().bundle, + imageData.owner.getIdentifier(), true); }); if (mQuickShareChip != null) { if (imageData.quickShareAction != null) { @@ -1115,22 +1100,6 @@ public class ScreenshotView extends FrameLayout implements mScreenshotData = null; } - private void startSharedTransition(ActionTransition transition) { - try { - mPendingSharedTransition = true; - transition.action.actionIntent.send(mInteractiveBroadcastOption); - - // fade out non-preview UI - createScreenshotFadeDismissAnimation().start(); - } catch (PendingIntent.CanceledException e) { - mPendingSharedTransition = false; - if (transition.onCancelRunnable != null) { - transition.onCancelRunnable.run(); - } - Log.e(TAG, "Intent cancelled", e); - } - } - private void prepareSharedTransition() { mPendingSharedTransition = true; // fade out non-preview UI diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 111278a002f9..7ac0fd50ea33 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -21,7 +21,6 @@ import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS; import static com.android.internal.util.ScreenshotHelper.SCREENSHOT_MSG_PROCESS_COMPLETE; import static com.android.internal.util.ScreenshotHelper.SCREENSHOT_MSG_URI; -import static com.android.systemui.flags.Flags.SCREENSHOT_WORK_PROFILE_POLICY; import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK; import static com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS; import static com.android.systemui.screenshot.LogConfig.DEBUG_SERVICE; @@ -59,7 +58,6 @@ import com.android.internal.util.ScreenshotRequest; import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.FlagListenable.FlagEvent; import com.android.systemui.flags.Flags; import java.util.concurrent.Executor; @@ -123,7 +121,6 @@ public class TakeScreenshotService extends Service { mContext = context; mBgExecutor = bgExecutor; mFeatureFlags = featureFlags; - mFeatureFlags.addListener(SCREENSHOT_WORK_PROFILE_POLICY, FlagEvent::requestNoRestart); mProcessor = processor; } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 827a4c12006b..636058bd9717 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -37,6 +37,7 @@ import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOS import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN; import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPENING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; @@ -233,6 +234,8 @@ import com.android.systemui.util.Utils; import com.android.systemui.util.time.SystemClock; import com.android.wm.shell.animation.FlingAnimationUtils; +import kotlin.Unit; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; @@ -243,7 +246,6 @@ import java.util.function.Consumer; import javax.inject.Inject; import javax.inject.Provider; -import kotlin.Unit; import kotlinx.coroutines.CoroutineDispatcher; @CentralSurfacesComponent.CentralSurfacesScope @@ -387,6 +389,7 @@ public final class NotificationPanelViewController implements Dumpable { private KeyguardBottomAreaView mKeyguardBottomArea; private boolean mExpanding; private boolean mSplitShadeEnabled; + private final boolean mMultiShadeEnabled; /** The bottom padding reserved for elements of the keyguard measuring notifications. */ private float mKeyguardNotificationBottomPadding; /** @@ -851,6 +854,7 @@ public final class NotificationPanelViewController implements Dumpable { mFeatureFlags = featureFlags; mAnimateBack = mFeatureFlags.isEnabled(Flags.WM_SHADE_ANIMATE_BACK_GESTURE); mTrackpadGestureBack = mFeatureFlags.isEnabled(Flags.TRACKPAD_GESTURE_FEATURES); + mMultiShadeEnabled = mFeatureFlags.isEnabled(Flags.DUAL_SHADE); mFalsingCollector = falsingCollector; mPowerManager = powerManager; mWakeUpCoordinator = coordinator; @@ -2806,7 +2810,6 @@ public final class NotificationPanelViewController implements Dumpable { public void setIsLaunchAnimationRunning(boolean running) { boolean wasRunning = mIsLaunchAnimationRunning; mIsLaunchAnimationRunning = running; - mCentralSurfaces.updateIsKeyguard(); if (wasRunning != mIsLaunchAnimationRunning) { mShadeExpansionStateManager.notifyLaunchingActivityChanged(running); } @@ -3458,7 +3461,9 @@ public final class NotificationPanelViewController implements Dumpable { Log.d(TAG, "Updating panel sysui state flags: fullyExpanded=" + isFullyExpanded() + " inQs=" + mQsController.getExpanded()); } - mSysUiState.setFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, + mSysUiState + .setFlag(SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE, getExpandedFraction() > 0) + .setFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, isFullyExpanded() && !mQsController.getExpanded()) .setFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED, isFullyExpanded() && mQsController.getExpanded()).commitUpdate(mDisplayId); @@ -3867,10 +3872,6 @@ public final class NotificationPanelViewController implements Dumpable { return mClosing || mIsLaunchAnimationRunning; } - public boolean isLaunchAnimationRunning() { - return mIsLaunchAnimationRunning; - } - public boolean isTracking() { return mTracking; } @@ -4023,8 +4024,11 @@ public final class NotificationPanelViewController implements Dumpable { * {@link #updateVisibility()}? That would allow us to make this method private. */ public void updatePanelExpansionAndVisibility() { - mShadeExpansionStateManager.onPanelExpansionChanged( - mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); + if (!mMultiShadeEnabled) { + mShadeExpansionStateManager.onPanelExpansionChanged( + mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); + } + updateVisibility(); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java index e7759df6e81b..156e4fd1889f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java @@ -301,11 +301,9 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW } private void applyKeyguardFlags(NotificationShadeWindowState state) { - // Keyguard is visible if it's showing or if it's fading away (in which case we're animating - // it out, but the wallpaper should remain visible as a backdrop for the animation); - final boolean keyguardOrAodVisible = (state.keyguardShowing || state.keyguardFadingAway) + final boolean keyguardOrAod = state.keyguardShowing || (state.dozing && mDozeParameters.getAlwaysOn()); - if ((keyguardOrAodVisible && !state.mediaBackdropShowing && !state.lightRevealScrimOpaque) + if ((keyguardOrAod && !state.mediaBackdropShowing && !state.lightRevealScrimOpaque) || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehind()) { // Show the wallpaper if we're on keyguard/AOD and the wallpaper is not occluded by a // solid backdrop. Also, show it if we are currently animating between the diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 9f467074d473..07c8e52e7a6c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -25,6 +25,7 @@ import static com.android.systemui.shade.NotificationPanelViewController.FLING_E import static com.android.systemui.shade.NotificationPanelViewController.FLING_HIDE; import static com.android.systemui.shade.NotificationPanelViewController.QS_PARALLAX_AMOUNT; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; +import static com.android.systemui.statusbar.StatusBarState.SHADE; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -258,6 +259,12 @@ public class QuickSettingsController { /** The duration of the notification bounds animation. */ private long mNotificationBoundsAnimationDuration; + /** TODO(b/273591201): remove after bug resolved */ + private int mLastClippingTopBound; + private int mLastNotificationsTopPadding; + private int mLastNotificationsClippingTopBound; + private int mLastNotificationsClippingTopBoundNssl; + private final Region mInterceptRegion = new Region(); /** The end bounds of a clipping animation. */ private final Rect mClippingAnimationEndBounds = new Rect(); @@ -643,7 +650,7 @@ public class QuickSettingsController { float appearAmount = mNotificationStackScrollLayoutController .calculateAppearFraction(mShadeExpandedHeight); float startHeight = -getExpansionHeight(); - if (mBarState == StatusBarState.SHADE) { + if (mBarState == SHADE) { // Small parallax as we pull down and clip QS startHeight = -getExpansionHeight() * QS_PARALLAX_AMOUNT; } @@ -1123,6 +1130,7 @@ public class QuickSettingsController { mClippingAnimationEndBounds.left, fraction); int animTop = (int) MathUtils.lerp(startTop, mClippingAnimationEndBounds.top, fraction); + logClippingTopBound("interpolated top bound", top); int animRight = (int) MathUtils.lerp(startRight, mClippingAnimationEndBounds.right, fraction); int animBottom = (int) MathUtils.lerp(startBottom, @@ -1243,6 +1251,8 @@ public class QuickSettingsController { // the screen without clipping. return -mAmbientState.getStackTopMargin(); } else { + logNotificationsClippingTopBound(qsTop, + mNotificationStackScrollLayoutController.getTop()); return qsTop - mNotificationStackScrollLayoutController.getTop(); } } @@ -1265,6 +1275,7 @@ public class QuickSettingsController { /** Calculate top padding for notifications */ public float calculateNotificationsTopPadding(boolean isShadeExpanding, int keyguardNotificationStaticPadding, float expandedFraction) { + float topPadding; boolean keyguardShowing = mBarState == KEYGUARD; if (mSplitShadeEnabled) { return keyguardShowing @@ -1281,19 +1292,27 @@ public class QuickSettingsController { int maxQsPadding = getMaxExpansionHeight(); int max = keyguardShowing ? Math.max( keyguardNotificationStaticPadding, maxQsPadding) : maxQsPadding; - return (int) MathUtils.lerp((float) getMinExpansionHeight(), + topPadding = (int) MathUtils.lerp((float) getMinExpansionHeight(), (float) max, expandedFraction); + logNotificationsTopPadding("keyguard and expandImmediate", topPadding); + return topPadding; } else if (isSizeChangeAnimationRunning()) { - return Math.max((int) mSizeChangeAnimator.getAnimatedValue(), + topPadding = Math.max((int) mSizeChangeAnimator.getAnimatedValue(), keyguardNotificationStaticPadding); + logNotificationsTopPadding("size change animation running", topPadding); + return topPadding; } else if (keyguardShowing) { // We can only do the smoother transition on Keyguard when we also are not collapsing // from a scrolled quick settings. - return MathUtils.lerp((float) keyguardNotificationStaticPadding, + topPadding = MathUtils.lerp((float) keyguardNotificationStaticPadding, (float) (getMaxExpansionHeight()), computeExpansionFraction()); + logNotificationsTopPadding("keyguard", topPadding); + return topPadding; } else { - return mQsFrameTranslateController.getNotificationsTopPadding( + topPadding = mQsFrameTranslateController.getNotificationsTopPadding( mExpansionHeight, mNotificationStackScrollLayoutController); + logNotificationsTopPadding("default case", topPadding); + return topPadding; } } @@ -1340,6 +1359,38 @@ public class QuickSettingsController { - mAmbientState.getScrollY()); } + /** TODO(b/273591201): remove after bug resolved */ + private void logNotificationsTopPadding(String message, float rawPadding) { + int padding = ((int) rawPadding / 10) * 10; + if (mBarState != KEYGUARD && padding != mLastNotificationsTopPadding && !mExpanded) { + mLastNotificationsTopPadding = padding; + mShadeLog.logNotificationsTopPadding(message, padding); + } + } + + /** TODO(b/273591201): remove after bug resolved */ + private void logClippingTopBound(String message, int top) { + top = (top / 10) * 10; + if (mBarState != KEYGUARD && mShadeExpandedFraction == 1 + && top != mLastClippingTopBound && !mExpanded) { + mLastClippingTopBound = top; + mShadeLog.logClippingTopBound(message, top); + } + } + + /** TODO(b/273591201): remove after bug resolved */ + private void logNotificationsClippingTopBound(int top, int nsslTop) { + top = (top / 10) * 10; + nsslTop = (nsslTop / 10) * 10; + if (mBarState == SHADE && mShadeExpandedFraction == 1 + && (top != mLastNotificationsClippingTopBound + || nsslTop != mLastNotificationsClippingTopBoundNssl) && !mExpanded) { + mLastNotificationsClippingTopBound = top; + mLastNotificationsClippingTopBoundNssl = nsslTop; + mShadeLog.logNotificationsClippingTopBound(top, nsslTop); + } + } + private int calculateTopClippingBound(int qsPanelBottomY) { int top; if (mSplitShadeEnabled) { @@ -1349,6 +1400,7 @@ public class QuickSettingsController { // If we're transitioning, let's use the actual value. The else case // can be wrong during transitions when waiting for the keyguard to unlock top = mTransitionToFullShadePosition; + logClippingTopBound("set while transitioning to full shade", top); } else { final float notificationTop = getEdgePosition(); if (mBarState == KEYGUARD) { @@ -1357,8 +1409,10 @@ public class QuickSettingsController { // this should go away once we unify the stackY position and don't have // to do this min anymore below. top = qsPanelBottomY; + logClippingTopBound("bypassing keyguard", top); } else { top = (int) Math.min(qsPanelBottomY, notificationTop); + logClippingTopBound("keyguard default case", top); } } else { top = (int) notificationTop; @@ -1366,12 +1420,14 @@ public class QuickSettingsController { } // TODO (b/265193930): remove dependency on NPVC top += mPanelViewControllerLazy.get().getOverStretchAmount(); + logClippingTopBound("including overstretch", top); // Correction for instant expansion caused by HUN pull down/ float minFraction = mPanelViewControllerLazy.get().getMinFraction(); if (minFraction > 0f && minFraction < 1f) { float realFraction = (mShadeExpandedFraction - minFraction) / (1f - minFraction); top *= MathUtils.saturate(realFraction / minFraction); + logClippingTopBound("after adjusted fraction", top); } } return top; diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index d34e127b194b..da4944c20f6e 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -280,4 +280,40 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { { "Split shade state changed: split shade ${if (bool1) "enabled" else "disabled"}" } ) } + + fun logNotificationsTopPadding(message: String, padding: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = message + int1 = padding + }, + { "QSC NotificationsTopPadding $str1: $int1"} + ) + } + + fun logClippingTopBound(message: String, top: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = message + int1 = top + }, + { "QSC ClippingTopBound $str1: $int1" } + ) + } + + fun logNotificationsClippingTopBound(top: Int, nsslTop: Int) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + int1 = top + int2 = nsslTop + }, + { "QSC NotificationsClippingTopBound set to $int1 - $int2" } + ) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index bc531da0ec40..3399f9df7fd5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -71,6 +71,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController; import com.android.systemui.statusbar.notification.row.NotificationGuts; import com.android.systemui.statusbar.notification.stack.PriorityBucket; +import com.android.systemui.util.ListenerSet; import java.util.ArrayList; import java.util.List; @@ -163,7 +164,8 @@ public final class NotificationEntry extends ListEntry { private boolean hasSentReply; private boolean mSensitive = true; - private List<OnSensitivityChangedListener> mOnSensitivityChangedListeners = new ArrayList<>(); + private ListenerSet<OnSensitivityChangedListener> mOnSensitivityChangedListeners = + new ListenerSet<>(); private boolean mAutoHeadsUp; private boolean mPulseSupressed; @@ -932,8 +934,9 @@ public final class NotificationEntry extends ListEntry { getRow().setSensitive(sensitive, deviceSensitive); if (sensitive != mSensitive) { mSensitive = sensitive; - for (int i = 0; i < mOnSensitivityChangedListeners.size(); i++) { - mOnSensitivityChangedListeners.get(i).onSensitivityChanged(this); + for (NotificationEntry.OnSensitivityChangedListener listener : + mOnSensitivityChangedListeners) { + listener.onSensitivityChanged(this); } } } @@ -944,7 +947,7 @@ public final class NotificationEntry extends ListEntry { /** Add a listener to be notified when the entry's sensitivity changes. */ public void addOnSensitivityChangedListener(OnSensitivityChangedListener listener) { - mOnSensitivityChangedListeners.add(listener); + mOnSensitivityChangedListeners.addIfAbsent(listener); } /** Remove a listener that was registered above. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java index 4065b98ab0c8..02055237c2b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java @@ -110,6 +110,8 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable { private final PipelineState mPipelineState = new PipelineState(); private final Map<String, GroupEntry> mGroups = new ArrayMap<>(); private Collection<NotificationEntry> mAllEntries = Collections.emptyList(); + @Nullable + private Collection<NotificationEntry> mPendingEntries = null; private int mIterationCount = 0; private final List<NotifFilter> mNotifPreGroupFilters = new ArrayList<>(); @@ -317,11 +319,9 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable { @Override public void onBuildList(Collection<NotificationEntry> entries, String reason) { Assert.isMainThread(); - mPipelineState.requireIsBefore(STATE_BUILD_STARTED); - + mPendingEntries = new ArrayList<>(entries); mLogger.logOnBuildList(reason); - mAllEntries = entries; - scheduleRebuild(/* reentrant = */ false); + rebuildListIfBefore(STATE_BUILD_STARTED); } }; @@ -398,6 +398,11 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable { Trace.beginSection("ShadeListBuilder.buildList"); mPipelineState.requireIsBefore(STATE_BUILD_STARTED); + if (mPendingEntries != null) { + mAllEntries = mPendingEntries; + mPendingEntries = null; + } + if (!mNotifStabilityManager.isPipelineRunAllowed()) { mLogger.logPipelineRunSuppressed(); Trace.endSection(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index d2db6224ef52..6500ff7fa210 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -359,7 +359,8 @@ public class PreparationCoordinator implements Coordinator { } NotifInflater.Params getInflaterParams(NotifUiAdjustment adjustment, String reason) { - return new NotifInflater.Params(adjustment.isMinimized(), reason); + return new NotifInflater.Params(adjustment.isMinimized(), reason, + adjustment.isSnoozeEnabled()); } private void abortInflation(NotificationEntry entry, String reason) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt index 08e21e8f668e..4483599d6857 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt @@ -61,5 +61,5 @@ interface NotifInflater { /** * A class holding parameters used when inflating the notification row */ - class Params(val isLowPriority: Boolean, val reason: String) + class Params(val isLowPriority: Boolean, val reason: String, val showSnooze: Boolean) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt index 745d6fe1d624..0d9a654fa485 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt @@ -16,12 +16,15 @@ package com.android.systemui.statusbar.notification.collection.inflation +import android.content.Context import android.database.ContentObserver import android.os.Handler +import android.os.HandlerExecutor import android.os.UserHandle import android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry @@ -39,11 +42,25 @@ class NotifUiAdjustmentProvider @Inject constructor( @Main private val handler: Handler, private val secureSettings: SecureSettings, private val lockscreenUserManager: NotificationLockscreenUserManager, - private val sectionStyleProvider: SectionStyleProvider + private val sectionStyleProvider: SectionStyleProvider, + private val userTracker: UserTracker ) { private val dirtyListeners = ListenerSet<Runnable>() private var isSnoozeEnabled = false + /** + * Update the snooze enabled value on user switch + */ + private val userTrackerCallback = object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + updateSnoozeEnabled() + } + } + + init { + userTracker.addCallback(userTrackerCallback, HandlerExecutor(handler)) + } + fun addDirtyListener(listener: Runnable) { if (dirtyListeners.isEmpty()) { lockscreenUserManager.addNotificationStateChangedListener(notifStateChangedListener) @@ -78,7 +95,8 @@ class NotifUiAdjustmentProvider @Inject constructor( } private fun updateSnoozeEnabled() { - isSnoozeEnabled = secureSettings.getInt(SHOW_NOTIFICATION_SNOOZE, 0) == 1 + isSnoozeEnabled = + secureSettings.getIntForUser(SHOW_NOTIFICATION_SNOOZE, 0, UserHandle.USER_CURRENT) == 1 } private fun isEntryMinimized(entry: NotificationEntry): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java index 56eb4b13dcde..611edf88bffb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java @@ -212,6 +212,9 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { mMessagingUtil.isImportantMessaging(entry.getSbn(), entry.getImportance()); final boolean isLowPriority = inflaterParams.isLowPriority(); + // Set show snooze action + row.setShowSnooze(inflaterParams.getShowSnooze()); + RowContentBindParams params = mRowContentBindStage.getStageParams(entry); params.requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED); params.requireContentViews(FLAG_CONTENT_VIEW_EXPANDED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a38f52727c26..a9d125508397 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -146,6 +146,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView // the background on first content update just in case it happens to be during a theme change. private boolean mUpdateSelfBackgroundOnUpdate = true; private boolean mIsSnoozed; + private boolean mShowSnooze = false; private boolean mIsFaded; private boolean mAnimatePinnedRoundness = false; @@ -3735,4 +3736,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView updateBaseRoundness(); } } + + /** Set whether this notification may show a snooze action. */ + public void setShowSnooze(boolean showSnooze) { + mShowSnooze = showSnooze; + } + + /** Whether this notification may show a snooze action. */ + public boolean getShowSnooze() { + return mShowSnooze; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java index fc9d9e8b736c..797038d1d615 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java @@ -28,6 +28,7 @@ import android.widget.TextView; import androidx.annotation.ColorInt; +import com.android.internal.util.ContrastColorUtil; import com.android.keyguard.AlphaOptimizedLinearLayout; import com.android.systemui.R; import com.android.systemui.statusbar.CrossFadeHelper; @@ -109,7 +110,7 @@ public class HybridNotificationView extends AlphaOptimizedLinearLayout public void bind(@Nullable CharSequence title, @Nullable CharSequence text, @Nullable View contentView) { - mTitleView.setText(title); + mTitleView.setText(title.toString()); mTitleView.setVisibility(TextUtils.isEmpty(title) ? GONE : VISIBLE); if (TextUtils.isEmpty(text)) { mTextView.setVisibility(GONE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 78392f78428f..451d837b63a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -26,7 +26,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.RemoteException; -import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; import android.util.AttributeSet; @@ -1440,11 +1439,9 @@ public class NotificationContentView extends FrameLayout implements Notification if (snoozeButton == null || actionContainer == null) { return; } - final boolean showSnooze = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0) == 1; // Notification.Builder can 'disable' the snooze button to prevent it from being shown here boolean snoozeDisabled = !snoozeButton.isEnabled(); - if (!showSnooze || snoozeDisabled) { + if (!mContainingNotification.getShowSnooze() || snoozeDisabled) { snoozeButton.setVisibility(GONE); return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d0fb416bf96a..bafc474d7123 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE; import static android.view.HapticFeedbackConstants.CLOCK_TICK; import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION; @@ -253,9 +252,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mLeftMenuItems.clear(); mRightMenuItems.clear(); - boolean showSnooze = Settings.Secure.getInt(mContext.getContentResolver(), - SHOW_NOTIFICATION_SNOOZE, 0) == 1; - + final boolean showSnooze = mParent.getShowSnooze(); // Construct the menu items based on the notification if (showSnooze) { // Only show snooze for non-foreground notifications, and if the setting is on diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index c0aed7a9f983..a2de3c38d090 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -200,6 +200,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private final boolean mDebugRemoveAnimation; private final boolean mSimplifiedAppearFraction; private final boolean mUseRoundnessSourceTypes; + private final boolean mSensitiveRevealAnimEndabled; private boolean mAnimatedInsets; private int mContentHeight; @@ -580,6 +581,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } }; + private final NotificationEntry.OnSensitivityChangedListener + mOnChildSensitivityChangedListener = + new NotificationEntry.OnSensitivityChangedListener() { + @Override + public void onSensitivityChanged(NotificationEntry entry) { + if (mAnimationsEnabled) { + mHideSensitiveNeedsAnimation = true; + requestChildrenUpdate(); + } + } + }; + private Consumer<Integer> mScrollListener; private final ScrollAdapter mScrollAdapter = new ScrollAdapter() { @Override @@ -611,6 +624,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mDebugRemoveAnimation = featureFlags.isEnabled(Flags.NSSL_DEBUG_REMOVE_ANIMATION); mSimplifiedAppearFraction = featureFlags.isEnabled(Flags.SIMPLIFIED_APPEAR_FRACTION); mUseRoundnessSourceTypes = featureFlags.isEnabled(Flags.USE_ROUNDNESS_SOURCETYPES); + mSensitiveRevealAnimEndabled = featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM); setAnimatedInsetsEnabled(featureFlags.isEnabled(Flags.ANIMATED_NOTIFICATION_SHADE_INSETS)); mSectionsManager = Dependency.get(NotificationSectionsManager.class); mScreenOffAnimationController = @@ -2860,6 +2874,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return; } child.setOnHeightChangedListener(null); + if (child instanceof ExpandableNotificationRow && mSensitiveRevealAnimEndabled) { + NotificationEntry entry = ((ExpandableNotificationRow) child).getEntry(); + entry.removeOnSensitivityChangedListener(mOnChildSensitivityChangedListener); + } updateScrollStateForRemovedChild(child); boolean animationGenerated = container != null && generateRemoveAnimation(child); if (animationGenerated) { @@ -3121,6 +3139,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private void onViewAddedInternal(ExpandableView child) { updateHideSensitiveForChild(child); child.setOnHeightChangedListener(mOnChildHeightChangedListener); + if (child instanceof ExpandableNotificationRow && mSensitiveRevealAnimEndabled) { + NotificationEntry entry = ((ExpandableNotificationRow) child).getEntry(); + entry.addOnSensitivityChangedListener(mOnChildSensitivityChangedListener); + } generateAddAnimation(child, false /* fromMoreCard */); updateAnimationState(child); updateChronometerForChild(child); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 2f404873dc7a..2bc09a100976 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -864,6 +864,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarSignalPolicy = statusBarSignalPolicy; mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager; mFeatureFlags = featureFlags; + mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mMainExecutor = delayableExecutor; mMessageRouter = messageRouter; @@ -872,7 +873,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mCameraLauncherLazy = cameraLauncherLazy; mAlternateBouncerInteractor = alternateBouncerInteractor; mUserTracker = userTracker; - mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mStartingSurfaceOptional = startingSurfaceOptional; @@ -1052,8 +1052,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // The light reveal scrim should always be fully revealed by the time the keyguard // is done going away. Double check that this is true. if (!mKeyguardStateController.isKeyguardGoingAway()) { - updateIsKeyguard(); - if (mLightRevealScrim.getRevealAmount() != 1f) { Log.e(TAG, "Keyguard is done going away, but someone left the light reveal " + "scrim at reveal amount: " + mLightRevealScrim.getRevealAmount()); @@ -1487,16 +1485,16 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { float fraction = event.getFraction(); boolean tracking = event.getTracking(); - boolean isExpanded = event.getExpanded(); dispatchPanelExpansionForKeyguardDismiss(fraction, tracking); + if (getNotificationPanelViewController() != null) { + getNotificationPanelViewController().updateSystemUiStateFlags(); + } + if (fraction == 0 || fraction == 1) { if (getNavigationBarView() != null) { getNavigationBarView().onStatusBarPanelStateChanged(); } - if (getNotificationPanelViewController() != null) { - getNotificationPanelViewController().updateSystemUiStateFlags(); - } } } @@ -2940,10 +2938,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { showKeyguardImpl(); } } else { - final boolean isLaunchingOrGoingAway = - mNotificationPanelViewController.isLaunchAnimationRunning() - || mKeyguardStateController.isKeyguardGoingAway(); - // During folding a foldable device this might be called as a result of // 'onScreenTurnedOff' call for the inner display. // In this case: @@ -2955,14 +2949,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { if (!mScreenOffAnimationController.isKeyguardHideDelayed() // If we're animating occluded, there's an activity launching over the keyguard // UI. Wait to hide it until after the animation concludes. - && !mKeyguardViewMediator.isOccludeAnimationPlaying() - // If we're occluded, but playing an animation (launch or going away animations) - // the keyguard is visible behind the animation. - && !(mKeyguardStateController.isOccluded() && isLaunchingOrGoingAway)) { - // If we're going away and occluded, it means we are launching over the - // unsecured keyguard, which will subsequently go away. Wait to hide it until - // after the animation concludes to avoid the lockscreen UI changing into the - // shade UI behind the launch animation. + && !mKeyguardViewMediator.isOccludeAnimationPlaying()) { return hideKeyguardImpl(forceStateChange); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt index 52237605caf9..174298ab6490 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt @@ -26,6 +26,7 @@ import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel +import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel import javax.inject.Inject import kotlinx.coroutines.flow.collect @@ -60,11 +61,7 @@ constructor( location: StatusBarLocation, ): LocationBasedWifiViewModel { val locationViewModel = - when (location) { - StatusBarLocation.HOME -> wifiViewModel.home - StatusBarLocation.KEYGUARD -> wifiViewModel.keyguard - StatusBarLocation.QS -> wifiViewModel.qs - } + viewModelForLocation(wifiViewModel, statusBarPipelineFlags, location) statusBarIconGroup.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/HomeWifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/HomeWifiViewModel.kt deleted file mode 100644 index a29c9b94e6b8..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/HomeWifiViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel - -import android.graphics.Color -import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags -import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow - -/** - * A view model for the wifi icon shown on the "home" page (aka, when the device is unlocked and not - * showing the shade, so the user is on the home-screen, or in an app). - */ -class HomeWifiViewModel( - statusBarPipelineFlags: StatusBarPipelineFlags, - wifiIcon: StateFlow<WifiIcon>, - isActivityInViewVisible: Flow<Boolean>, - isActivityOutViewVisible: Flow<Boolean>, - isActivityContainerVisible: Flow<Boolean>, - isAirplaneSpacerVisible: Flow<Boolean>, -) : - LocationBasedWifiViewModel( - statusBarPipelineFlags, - debugTint = Color.CYAN, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/KeyguardWifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/KeyguardWifiViewModel.kt deleted file mode 100644 index 1e190fb898ff..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/KeyguardWifiViewModel.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel - -import android.graphics.Color -import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags -import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow - -/** A view model for the wifi icon shown on keyguard (lockscreen). */ -class KeyguardWifiViewModel( - statusBarPipelineFlags: StatusBarPipelineFlags, - wifiIcon: StateFlow<WifiIcon>, - isActivityInViewVisible: Flow<Boolean>, - isActivityOutViewVisible: Flow<Boolean>, - isActivityContainerVisible: Flow<Boolean>, - isAirplaneSpacerVisible: Flow<Boolean>, -) : - LocationBasedWifiViewModel( - statusBarPipelineFlags, - debugTint = Color.MAGENTA, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt index 02c3a652cc8d..b731a41d442b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/LocationBasedWifiViewModel.kt @@ -17,10 +17,8 @@ package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel import android.graphics.Color +import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags -import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow /** * A view model for a wifi icon in a specific location. This allows us to control parameters that @@ -29,24 +27,10 @@ import kotlinx.coroutines.flow.StateFlow * Must be subclassed for each distinct location. */ abstract class LocationBasedWifiViewModel( + val commonImpl: WifiViewModelCommon, statusBarPipelineFlags: StatusBarPipelineFlags, debugTint: Int, - - /** The wifi icon that should be displayed. */ - val wifiIcon: StateFlow<WifiIcon>, - - /** True if the activity in view should be visible. */ - val isActivityInViewVisible: Flow<Boolean>, - - /** True if the activity out view should be visible. */ - val isActivityOutViewVisible: Flow<Boolean>, - - /** True if the activity container view should be visible. */ - val isActivityContainerVisible: Flow<Boolean>, - - /** True if the airplane spacer view should be visible. */ - val isAirplaneSpacerVisible: Flow<Boolean>, -) { +) : WifiViewModelCommon by commonImpl { val useDebugColoring: Boolean = statusBarPipelineFlags.useDebugColoring() val defaultColor: Int = @@ -55,4 +39,48 @@ abstract class LocationBasedWifiViewModel( } else { Color.WHITE } + + companion object { + /** + * Returns a new instance of [LocationBasedWifiViewModel] that's specific to the given + * [location]. + */ + fun viewModelForLocation( + commonImpl: WifiViewModelCommon, + flags: StatusBarPipelineFlags, + location: StatusBarLocation, + ): LocationBasedWifiViewModel = + when (location) { + StatusBarLocation.HOME -> HomeWifiViewModel(commonImpl, flags) + StatusBarLocation.KEYGUARD -> KeyguardWifiViewModel(commonImpl, flags) + StatusBarLocation.QS -> QsWifiViewModel(commonImpl, flags) + } + } } + +/** + * A view model for the wifi icon shown on the "home" page (aka, when the device is unlocked and not + * showing the shade, so the user is on the home-screen, or in an app). + */ +class HomeWifiViewModel( + commonImpl: WifiViewModelCommon, + statusBarPipelineFlags: StatusBarPipelineFlags, +) : + WifiViewModelCommon, + LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.CYAN) + +/** A view model for the wifi icon shown on keyguard (lockscreen). */ +class KeyguardWifiViewModel( + commonImpl: WifiViewModelCommon, + statusBarPipelineFlags: StatusBarPipelineFlags, +) : + WifiViewModelCommon, + LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.MAGENTA) + +/** A view model for the wifi icon shown in quick settings (when the shade is pulled down). */ +class QsWifiViewModel( + commonImpl: WifiViewModelCommon, + statusBarPipelineFlags: StatusBarPipelineFlags, +) : + WifiViewModelCommon, + LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.GREEN) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/QsWifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/QsWifiViewModel.kt deleted file mode 100644 index 18e62b284cb9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/QsWifiViewModel.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel - -import android.graphics.Color -import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags -import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow - -/** A view model for the wifi icon shown in quick settings (when the shade is pulled down). */ -class QsWifiViewModel( - statusBarPipelineFlags: StatusBarPipelineFlags, - wifiIcon: StateFlow<WifiIcon>, - isActivityInViewVisible: Flow<Boolean>, - isActivityOutViewVisible: Flow<Boolean>, - isActivityContainerVisible: Flow<Boolean>, - isAirplaneSpacerVisible: Flow<Boolean>, -) : - LocationBasedWifiViewModel( - statusBarPipelineFlags, - debugTint = Color.GREEN, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt index 4b24e7a390e4..c9a0786acc72 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt @@ -72,7 +72,7 @@ constructor( @Application private val scope: CoroutineScope, statusBarPipelineFlags: StatusBarPipelineFlags, wifiConstants: WifiConstants, -) { +) : WifiViewModelCommon { /** Returns the icon to use based on the given network. */ private fun WifiNetworkModel.icon(): WifiIcon { return when (this) { @@ -106,8 +106,7 @@ constructor( } } - /** The wifi icon that should be displayed. */ - private val wifiIcon: StateFlow<WifiIcon> = + override val wifiIcon: StateFlow<WifiIcon> = combine( interactor.isEnabled, interactor.isDefault, @@ -162,17 +161,17 @@ constructor( .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = default) } - private val isActivityInViewVisible: Flow<Boolean> = + override val isActivityInViewVisible: Flow<Boolean> = activity .map { it.hasActivityIn } .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) - private val isActivityOutViewVisible: Flow<Boolean> = + override val isActivityOutViewVisible: Flow<Boolean> = activity .map { it.hasActivityOut } .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) - private val isActivityContainerVisible: Flow<Boolean> = + override val isActivityContainerVisible: Flow<Boolean> = combine(isActivityInViewVisible, isActivityOutViewVisible) { activityIn, activityOut -> activityIn || activityOut } @@ -181,42 +180,9 @@ constructor( // TODO(b/238425913): It isn't ideal for the wifi icon to need to know about whether the // airplane icon is visible. Instead, we should have a parent StatusBarSystemIconsViewModel // that appropriately knows about both icons and sets the padding appropriately. - private val isAirplaneSpacerVisible: Flow<Boolean> = + override val isAirplaneSpacerVisible: Flow<Boolean> = airplaneModeViewModel.isAirplaneModeIconVisible - /** A view model for the status bar on the home screen. */ - val home: HomeWifiViewModel = - HomeWifiViewModel( - statusBarPipelineFlags, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) - - /** A view model for the status bar on keyguard. */ - val keyguard: KeyguardWifiViewModel = - KeyguardWifiViewModel( - statusBarPipelineFlags, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) - - /** A view model for the status bar in quick settings. */ - val qs: QsWifiViewModel = - QsWifiViewModel( - statusBarPipelineFlags, - wifiIcon, - isActivityInViewVisible, - isActivityOutViewVisible, - isActivityContainerVisible, - isAirplaneSpacerVisible, - ) - companion object { @StringRes @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelCommon.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelCommon.kt new file mode 100644 index 000000000000..eccf02397a82 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelCommon.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel + +import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow + +/** + * A common view model interface that can be used for delegation between [WifiViewModel] and + * [LocationBasedWifiViewModel]. + */ +interface WifiViewModelCommon { + /** The wifi icon that should be displayed. */ + val wifiIcon: StateFlow<WifiIcon> + + /** True if the activity in view should be visible. */ + val isActivityInViewVisible: Flow<Boolean> + + /** True if the activity out view should be visible. */ + val isActivityOutViewVisible: Flow<Boolean> + + /** True if the activity container view should be visible. */ + val isActivityContainerVisible: Flow<Boolean> + + /** True if the airplane spacer view should be visible. */ + val isAirplaneSpacerVisible: Flow<Boolean> +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 4866f73b8d9f..a08aa88e0c5a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -78,6 +78,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; +import com.android.internal.util.ContrastColorUtil; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.animation.InterpolatorsAndroidX; @@ -221,7 +222,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene final int stroke = colorized ? mContext.getResources().getDimensionPixelSize( R.dimen.remote_input_view_text_stroke) : 0; if (colorized) { - final boolean dark = Notification.Builder.isColorDark(backgroundColor); + final boolean dark = ContrastColorUtil.isColorDark(backgroundColor); final int foregroundColor = dark ? Color.WHITE : Color.BLACK; final int inverseColor = dark ? Color.BLACK : Color.WHITE; editBgColor = backgroundColor; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java index a537b2a238cd..9e88ceb3a0d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -726,7 +726,7 @@ public class SmartReplyView extends ViewGroup { mCurrentBackgroundColor = backgroundColor; mCurrentColorized = colorized; - final boolean dark = Notification.Builder.isColorDark(backgroundColor); + final boolean dark = ContrastColorUtil.isColorDark(backgroundColor); mCurrentTextColor = ContrastColorUtil.ensureTextContrast( dark ? mDefaultTextColorDarkBg : mDefaultTextColor, diff --git a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java index 166ac9e737f3..f09b2f76e38c 100644 --- a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java +++ b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java @@ -21,6 +21,7 @@ import android.graphics.Region; import android.util.Log; import android.view.AttachedSurfaceControl; import android.view.View; +import android.view.ViewGroup; import androidx.concurrent.futures.CallbackToFutureAdapter; @@ -118,7 +119,9 @@ public class TouchInsetManager { affectedSurfaces.put(surface, Region.obtain()); } final Rect boundaries = new Rect(); - view.getBoundsOnScreen(boundaries); + view.getDrawingRect(boundaries); + ((ViewGroup) view.getRootView()) + .offsetDescendantRectToMyCoords(view, boundaries); affectedSurfaces.get(surface).op(boundaries, Region.Op.UNION); }); mManager.setTouchRegions(this, affectedSurfaces); diff --git a/packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java b/packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java new file mode 100644 index 000000000000..8acd6535e751 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.util.display; + +import android.content.Context; +import android.graphics.Rect; +import android.hardware.display.DisplayManager; +import android.view.Display; +import android.view.WindowManager; + +import javax.inject.Inject; + +/** + * Utility class for working with displays. + */ +public class DisplayHelper { + private final Context mContext; + private final DisplayManager mDisplayManager; + + /** + * Default constructor. + */ + @Inject + public DisplayHelper(Context context, DisplayManager displayManager) { + mContext = context; + mDisplayManager = displayManager; + } + + + /** + * Returns the maximum display bounds for the given window context type. + */ + public Rect getMaxBounds(int displayId, int windowContextType) { + final Display display = mDisplayManager.getDisplay(displayId); + WindowManager windowManager = mContext.createDisplayContext(display) + .createWindowContext(windowContextType, null) + .getSystemService(WindowManager.class); + return windowManager.getMaximumWindowMetrics().getBounds(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt index 7b8235acb0a7..518f5a774d7f 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt @@ -16,8 +16,7 @@ package com.android.systemui.wallet.controller -import android.Manifest -import android.content.Context +import android.content.Intent import android.content.IntentFilter import android.service.quickaccesswallet.GetWalletCardsError import android.service.quickaccesswallet.GetWalletCardsResponse @@ -32,13 +31,21 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import javax.inject.Inject import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.shareIn +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +@OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton class WalletContextualSuggestionsController @Inject @@ -48,68 +55,99 @@ constructor( broadcastDispatcher: BroadcastDispatcher, featureFlags: FeatureFlags ) { + private val cardsReceivedCallbacks: MutableSet<(List<WalletCard>) -> Unit> = mutableSetOf() + private val allWalletCards: Flow<List<WalletCard>> = if (featureFlags.isEnabled(Flags.ENABLE_WALLET_CONTEXTUAL_LOYALTY_CARDS)) { - conflatedCallbackFlow { - val callback = - object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback { - override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) { - trySendWithFailureLogging(response.walletCards, TAG) - } + // TODO(b/237409756) determine if we should debounce this so we don't call the service + // too frequently. Also check if the list actually changed before calling callbacks. + broadcastDispatcher + .broadcastFlow(IntentFilter(Intent.ACTION_SCREEN_ON)) + .flatMapLatest { + conflatedCallbackFlow { + val callback = + object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback { + override fun onWalletCardsRetrieved( + response: GetWalletCardsResponse + ) { + trySendWithFailureLogging(response.walletCards, TAG) + } - override fun onWalletCardRetrievalError(error: GetWalletCardsError) { - trySendWithFailureLogging(emptyList<WalletCard>(), TAG) - } - } + override fun onWalletCardRetrievalError( + error: GetWalletCardsError + ) { + trySendWithFailureLogging(emptyList<WalletCard>(), TAG) + } + } - walletController.setupWalletChangeObservers( - callback, - QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE, - QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE - ) - walletController.updateWalletPreference() - walletController.queryWalletCards(callback) + walletController.setupWalletChangeObservers( + callback, + QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE, + QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE + ) + walletController.updateWalletPreference() + walletController.queryWalletCards(callback) - awaitClose { - walletController.unregisterWalletChangeObservers( - QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE, - QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE - ) + awaitClose { + walletController.unregisterWalletChangeObservers( + QuickAccessWalletController.WalletChangeEvent + .WALLET_PREFERENCE_CHANGE, + QuickAccessWalletController.WalletChangeEvent + .DEFAULT_PAYMENT_APP_CHANGE + ) + } + } } - } + .onEach { notifyCallbacks(it) } + .stateIn( + applicationCoroutineScope, + // Needs to be done eagerly since we need to notify callbacks even if there are + // no subscribers + SharingStarted.Eagerly, + emptyList() + ) } else { emptyFlow() } - private val contextualSuggestionsCardIds: Flow<Set<String>> = - if (featureFlags.isEnabled(Flags.ENABLE_WALLET_CONTEXTUAL_LOYALTY_CARDS)) { - broadcastDispatcher.broadcastFlow( - filter = IntentFilter(ACTION_UPDATE_WALLET_CONTEXTUAL_SUGGESTIONS), - permission = Manifest.permission.BIND_QUICK_ACCESS_WALLET_SERVICE, - flags = Context.RECEIVER_EXPORTED - ) { intent, _ -> - if (intent.hasExtra(UPDATE_CARD_IDS_EXTRA)) { - intent.getStringArrayListExtra(UPDATE_CARD_IDS_EXTRA).toSet() - } else { - emptySet() - } - } - } else { - emptyFlow() - } + private val _suggestionCardIds: MutableStateFlow<Set<String>> = MutableStateFlow(emptySet()) + private val contextualSuggestionsCardIds: Flow<Set<String>> = _suggestionCardIds.asStateFlow() val contextualSuggestionCards: Flow<List<WalletCard>> = combine(allWalletCards, contextualSuggestionsCardIds) { cards, ids -> - cards.filter { card -> ids.contains(card.cardId) } + val ret = + cards.filter { card -> + card.cardType == WalletCard.CARD_TYPE_NON_PAYMENT && + ids.contains(card.cardId) + } + ret } - .shareIn(applicationCoroutineScope, replay = 1, started = SharingStarted.Eagerly) + .stateIn(applicationCoroutineScope, SharingStarted.WhileSubscribed(), emptyList()) - companion object { - private const val ACTION_UPDATE_WALLET_CONTEXTUAL_SUGGESTIONS = - "com.android.systemui.wallet.UPDATE_CONTEXTUAL_SUGGESTIONS" + /** When called, {@link contextualSuggestionCards} will be updated to be for these IDs. */ + fun setSuggestionCardIds(cardIds: Set<String>) { + _suggestionCardIds.update { _ -> cardIds } + } - private const val UPDATE_CARD_IDS_EXTRA = "cardIds" + /** Register callback to be called when a new list of cards is fetched. */ + fun registerWalletCardsReceivedCallback(callback: (List<WalletCard>) -> Unit) { + cardsReceivedCallbacks.add(callback) + } + /** Unregister callback to be called when a new list of cards is fetched. */ + fun unregisterWalletCardsReceivedCallback(callback: (List<WalletCard>) -> Unit) { + cardsReceivedCallbacks.remove(callback) + } + + private fun notifyCallbacks(cards: List<WalletCard>) { + applicationCoroutineScope.launch { + cardsReceivedCallbacks.onEach { callback -> + callback(cards.filter { card -> card.cardType == WalletCard.CARD_TYPE_NON_PAYMENT }) + } + } + } + + companion object { private const val TAG = "WalletSuggestions" } } diff --git a/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingSecondaryUserActivity.java b/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingSecondaryUserActivity.java index 7a31fa54b1cd..f9f14e0bc362 100644 --- a/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingSecondaryUserActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wifi/WifiDebuggingSecondaryUserActivity.java @@ -97,7 +97,7 @@ public class WifiDebuggingSecondaryUserActivity extends AlertActivity filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); registerReceiver(mWifiChangeReceiver, filter); // Close quick shade - sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + closeSystemDialogs(); } @Override diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml index ce2d15f97cd8..302a53068fb0 100644 --- a/packages/SystemUI/tests/AndroidManifest.xml +++ b/packages/SystemUI/tests/AndroidManifest.xml @@ -108,6 +108,11 @@ android:excludeFromRecents="true" /> + <activity android:name="com.android.systemui.controls.ui.TestableControlsActivity" + android:exported="false" + android:excludeFromRecents="true" + /> + <activity android:name="com.android.systemui.screenshot.ScrollViewActivity" android:exported="false" /> @@ -133,6 +138,14 @@ android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" /> + <activity android:name="com.android.systemui.activity.EmptyTestActivity" + android:exported="false"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </activity> + <provider android:name="androidx.startup.InitializationProvider" tools:replace="android:authorities" diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index fb21db796c3b..a8b42544fd87 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -2159,8 +2159,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { keyguardIsVisible(); verifyFaceAuthenticateCall(); - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); + verifyFingerprintAuthenticateCall(); final CancellationSignal faceCancel = spy(mKeyguardUpdateMonitor.mFaceCancelSignal); final CancellationSignal fpCancel = spy(mKeyguardUpdateMonitor.mFingerprintCancelSignal); @@ -2627,8 +2626,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } private void verifyFingerprintAuthenticateCall() { - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); + verify(mFingerprintManager).authenticate(any(), any(), any(), any(), any()); } private void verifyFingerprintDetectNeverCalled() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/ChooserPinMigrationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/ChooserPinMigrationTest.kt new file mode 100644 index 000000000000..44da5f42aafd --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/ChooserPinMigrationTest.kt @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui + +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.content.res.Resources +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.broadcast.BroadcastSender +import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.kotlinArgumentCaptor +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import java.io.File +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class ChooserPinMigrationTest : SysuiTestCase() { + + private val fakeFeatureFlags = FakeFeatureFlags() + private val fakePreferences = + mutableMapOf( + "TestPinnedPackage/TestPinnedClass" to true, + "TestUnpinnedPackage/TestUnpinnedClass" to false, + ) + private val intent = kotlinArgumentCaptor<Intent>() + private val permission = kotlinArgumentCaptor<String>() + + private lateinit var chooserPinMigration: ChooserPinMigration + + @Mock private lateinit var mockContext: Context + @Mock private lateinit var mockResources: Resources + @Mock + private lateinit var mockLegacyPinPrefsFileSupplier: + ChooserPinMigration.Companion.LegacyPinPrefsFileSupplier + @Mock private lateinit var mockFile: File + @Mock private lateinit var mockSharedPreferences: SharedPreferences + @Mock private lateinit var mockSharedPreferencesEditor: SharedPreferences.Editor + @Mock private lateinit var mockBroadcastSender: BroadcastSender + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + + whenever(mockContext.resources).thenReturn(mockResources) + whenever(mockContext.getSharedPreferences(any<File>(), anyInt())) + .thenReturn(mockSharedPreferences) + whenever(mockResources.getString(anyInt())).thenReturn("TestPackage/TestClass") + whenever(mockSharedPreferences.all).thenReturn(fakePreferences) + whenever(mockSharedPreferences.edit()).thenReturn(mockSharedPreferencesEditor) + whenever(mockSharedPreferencesEditor.commit()).thenReturn(true) + whenever(mockLegacyPinPrefsFileSupplier.get()).thenReturn(mockFile) + whenever(mockFile.exists()).thenReturn(true) + whenever(mockFile.delete()).thenReturn(true) + fakeFeatureFlags.set(Flags.CHOOSER_MIGRATION_ENABLED, true) + } + + @Test + fun start_performsMigration() { + // Arrange + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verify(mockBroadcastSender).sendBroadcast(intent.capture(), permission.capture()) + assertThat(intent.value.action).isEqualTo("android.intent.action.CHOOSER_PIN_MIGRATION") + assertThat(intent.value.`package`).isEqualTo("TestPackage") + assertThat(intent.value.extras?.keySet()).hasSize(2) + assertThat(intent.value.hasExtra("TestPinnedPackage/TestPinnedClass")).isTrue() + assertThat(intent.value.getBooleanExtra("TestPinnedPackage/TestPinnedClass", false)) + .isTrue() + assertThat(intent.value.hasExtra("TestUnpinnedPackage/TestUnpinnedClass")).isTrue() + assertThat(intent.value.getBooleanExtra("TestUnpinnedPackage/TestUnpinnedClass", true)) + .isFalse() + assertThat(permission.value).isEqualTo("android.permission.RECEIVE_CHOOSER_PIN_MIGRATION") + + // Assert + verify(mockSharedPreferencesEditor).clear() + verify(mockSharedPreferencesEditor).commit() + + // Assert + verify(mockFile).delete() + } + + @Test + fun start_doesNotDeleteLegacyPreferencesFile_whenClearingItFails() { + // Arrange + whenever(mockSharedPreferencesEditor.commit()).thenReturn(false) + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verify(mockBroadcastSender).sendBroadcast(intent.capture(), permission.capture()) + assertThat(intent.value.action).isEqualTo("android.intent.action.CHOOSER_PIN_MIGRATION") + assertThat(intent.value.`package`).isEqualTo("TestPackage") + assertThat(intent.value.extras?.keySet()).hasSize(2) + assertThat(intent.value.hasExtra("TestPinnedPackage/TestPinnedClass")).isTrue() + assertThat(intent.value.getBooleanExtra("TestPinnedPackage/TestPinnedClass", false)) + .isTrue() + assertThat(intent.value.hasExtra("TestUnpinnedPackage/TestUnpinnedClass")).isTrue() + assertThat(intent.value.getBooleanExtra("TestUnpinnedPackage/TestUnpinnedClass", true)) + .isFalse() + assertThat(permission.value).isEqualTo("android.permission.RECEIVE_CHOOSER_PIN_MIGRATION") + + // Assert + verify(mockSharedPreferencesEditor).clear() + verify(mockSharedPreferencesEditor).commit() + + // Assert + verify(mockFile, never()).delete() + } + + @Test + fun start_OnlyDeletesLegacyPreferencesFile_whenEmpty() { + // Arrange + whenever(mockSharedPreferences.all).thenReturn(emptyMap()) + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verifyZeroInteractions(mockBroadcastSender) + + // Assert + verifyZeroInteractions(mockSharedPreferencesEditor) + + // Assert + verify(mockFile).delete() + } + + @Test + fun start_DoesNotDoMigration_whenFlagIsDisabled() { + // Arrange + fakeFeatureFlags.set(Flags.CHOOSER_MIGRATION_ENABLED, false) + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verifyZeroInteractions(mockBroadcastSender) + + // Assert + verifyZeroInteractions(mockSharedPreferencesEditor) + + // Assert + verify(mockFile, never()).delete() + } + + @Test + fun start_DoesNotDoMigration_whenLegacyPreferenceFileNotPresent() { + // Arrange + whenever(mockFile.exists()).thenReturn(false) + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verifyZeroInteractions(mockBroadcastSender) + + // Assert + verifyZeroInteractions(mockSharedPreferencesEditor) + + // Assert + verify(mockFile, never()).delete() + } + + @Test + fun start_DoesNotDoMigration_whenConfiguredChooserComponentIsInvalid() { + // Arrange + whenever(mockResources.getString(anyInt())).thenReturn("InvalidComponent") + chooserPinMigration = + ChooserPinMigration( + mockContext, + fakeFeatureFlags, + mockBroadcastSender, + mockLegacyPinPrefsFileSupplier, + ) + + // Act + chooserPinMigration.start() + + // Assert + verifyZeroInteractions(mockBroadcastSender) + + // Assert + verifyZeroInteractions(mockSharedPreferencesEditor) + + // Assert + verify(mockFile, never()).delete() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java index 213ce9e4d6a1..eff8c019efb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java @@ -16,6 +16,7 @@ package com.android.systemui.accessibility; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -68,6 +69,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { @Mock private WindowMagnificationController mWindowMagnificationController; @Mock + private MagnificationSettingsController mMagnificationSettingsController; + @Mock private ModeSwitchesController mModeSwitchesController; @Mock private SysUiState mSysUiState; @@ -94,9 +97,11 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, mSysUiState, mOverviewProxyService, mSecureSettings, - mDisplayTracker); + mDisplayTracker, getContext().getSystemService(DisplayManager.class)); mWindowMagnification.mMagnificationControllerSupplier = new FakeControllerSupplier( mContext.getSystemService(DisplayManager.class)); + mWindowMagnification.mMagnificationSettingsSupplier = new FakeSettingsSupplier( + mContext.getSystemService(DisplayManager.class)); mWindowMagnification.requestWindowMagnificationConnection(true); assertNotNull(mIWindowMagnificationConnection); @@ -151,6 +156,9 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { @Test public void showMagnificationButton() throws RemoteException { + // magnification settings panel should not be showing + assertFalse(mWindowMagnification.isMagnificationSettingsPanelShowing(TEST_DISPLAY)); + mIWindowMagnificationConnection.showMagnificationButton(TEST_DISPLAY, Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); waitForIdleSync(); @@ -167,6 +175,14 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { verify(mModeSwitchesController).removeButton(TEST_DISPLAY); } + @Test + public void removeMagnificationSettingsPanel() throws RemoteException { + mIWindowMagnificationConnection.removeMagnificationSettingsPanel(TEST_DISPLAY); + waitForIdleSync(); + + verify(mMagnificationSettingsController).closeMagnificationSettings(); + } + private class FakeControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationController> { @@ -179,5 +195,18 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { return mWindowMagnificationController; } } + + private class FakeSettingsSupplier extends + DisplayIdIndexSupplier<MagnificationSettingsController> { + + FakeSettingsSupplier(DisplayManager displayManager) { + super(displayManager); + } + + @Override + protected MagnificationSettingsController createInstance(Display display) { + return mMagnificationSettingsController; + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index 00cb49169048..79dc057e4f28 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -17,7 +17,6 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; -import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; @@ -45,6 +44,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -57,7 +57,6 @@ import android.os.Handler; import android.os.SystemClock; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.util.SparseIntArray; import android.view.Choreographer; import android.view.MotionEvent; import android.view.View; @@ -100,7 +99,8 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { private AccessibilityManager mAccessibilityManager; @Mock private SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; - private SwitchListenerStub mSwitchListener; + @Mock + private MagnificationModeSwitch.ClickListener mClickListener; private TestableWindowManager mWindowManager; private ViewPropertyAnimator mViewPropertyAnimator; private MagnificationModeSwitch mMagnificationModeSwitch; @@ -113,7 +113,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mContext = Mockito.spy(getContext()); final WindowManager wm = mContext.getSystemService(WindowManager.class); - mSwitchListener = new SwitchListenerStub(); mWindowManager = spy(new TestableWindowManager(wm)); mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager); mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager); @@ -132,7 +131,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { }).when(mSfVsyncFrameProvider).postFrameCallback( any(Choreographer.FrameCallback.class)); mMagnificationModeSwitch = new MagnificationModeSwitch(mContext, mSpyImageView, - mSfVsyncFrameProvider, mSwitchListener); + mSfVsyncFrameProvider, mClickListener); assertNotNull(mTouchListener); } @@ -286,7 +285,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void performSingleTap_fullscreenMode_removeViewAndChangeSettingsValue() { + public void performSingleTap_fullscreenMode_callbackTriggered() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); resetAndStubMockImageViewAndAnimator(); @@ -298,7 +297,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { mTouchListener.onTouch(mSpyImageView, obtainMotionEvent(downTime, downTime, ACTION_UP, 100, 100)); - verifyTapAction(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + verify(mClickListener).onClick(eq(mContext.getDisplayId())); } @Test @@ -347,7 +346,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( downTime, downTime, ACTION_UP, 100 + offset, 100)); - assertModeUnchanged(); + verify(mClickListener, never()).onClick(anyInt()); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -363,7 +362,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( downTime, downTime, ACTION_CANCEL, 100, 100)); - assertModeUnchanged(); + verify(mClickListener, never()).onClick(anyInt()); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -383,7 +382,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( downTime, downTime, ACTION_CANCEL, 100 + offset, 100)); - assertModeUnchanged(); + verify(mClickListener, never()).onClick(anyInt()); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -401,7 +400,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { assertThat(nodeInfo.getActionList(), hasItems(new AccessibilityNodeInfo.AccessibilityAction( ACTION_CLICK.getId(), mContext.getResources().getString( - R.string.magnification_mode_switch_click_label)))); + R.string.magnification_open_settings_click_label)))); assertThat(nodeInfo.getActionList(), hasItems(new AccessibilityNodeInfo.AccessibilityAction( R.id.accessibility_action_move_up, mContext.getResources().getString( @@ -421,14 +420,14 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void performClickA11yActions_showWindowModeButton_verifyTapAction() { + public void performClickA11yActions_showWindowModeButton_callbackTriggered() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); resetAndStubMockImageViewAndAnimator(); mSpyImageView.performAccessibilityAction( ACTION_CLICK.getId(), null); - verifyTapAction(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + verify(mClickListener).onClick(mContext.getDisplayId()); } @Test @@ -534,11 +533,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { assertEquals(expectedY, mWindowManager.getLayoutParamsFromAttachedView().y); } - private void assertModeUnchanged() { - assertEquals(SwitchListenerStub.MODE_INVALID, - mSwitchListener.getChangedMode(mContext.getDisplayId())); - } - private void assertShowFadingAnimation(float alpha) { final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class); if (alpha == FADE_IN_ALPHA) { // Fade-in @@ -588,20 +582,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { doNothing().when(mViewPropertyAnimator).start(); } - /** - * Verifies the tap behaviour including the image of the button and the magnification mode. - * - * @param expectedMode the expected mode after tapping - */ - private void verifyTapAction(int expectedMode) { - verify(mViewPropertyAnimator).cancel(); - verify(mSpyImageView).setImageResource( - getIconResId(expectedMode)); - verify(mWindowManager).removeView(mSpyImageView); - final int changedMode = mSwitchListener.getChangedMode(mContext.getDisplayId()); - assertEquals(expectedMode, changedMode); - } - private MotionEvent obtainMotionEvent(long downTime, long eventTime, int action, float x, float y) { return mMotionEventHelper.obtainMotionEvent(downTime, eventTime, action, x, y); @@ -624,20 +604,4 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { assertEquals(expectedX, layoutParams.x); assertEquals(expectedY, layoutParams.y); } - - private static class SwitchListenerStub implements MagnificationModeSwitch.SwitchListener { - - private static final int MODE_INVALID = -1; - - private final SparseIntArray mModes = new SparseIntArray(); - - @Override - public void onSwitch(int displayId, int magnificationMode) { - mModes.put(displayId, magnificationMode); - } - - int getChangedMode(int displayId) { - return mModes.get(displayId, MODE_INVALID); - } - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java new file mode 100644 index 000000000000..30cbc5242a81 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.accessibility; + +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; + +import android.content.pm.ActivityInfo; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import androidx.test.filters.SmallTest; + +import com.android.internal.graphics.SfVsyncFrameCallbackProvider; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize; +import com.android.systemui.util.settings.SecureSettings; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +/** Tests the MagnificationSettingsController. */ +@TestableLooper.RunWithLooper(setAsMainLooper = true) +public class MagnificationSettingsControllerTest extends SysuiTestCase { + + private MagnificationSettingsController mMagnificationSettingsController; + @Mock + private MagnificationSettingsController.Callback mMagnificationSettingControllerCallback; + + @Mock + private WindowMagnificationSettings mWindowMagnificationSettings; + + @Mock + private SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; + @Mock + private SecureSettings mSecureSettings; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mMagnificationSettingsController = new MagnificationSettingsController( + mContext, mSfVsyncFrameProvider, + mMagnificationSettingControllerCallback, mSecureSettings, + mWindowMagnificationSettings); + } + + @After + public void tearDown() { + mMagnificationSettingsController.closeMagnificationSettings(); + } + + @Test + public void testShowSettingsPanel() { + final int mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; + mMagnificationSettingsController.showMagnificationSettings(mode); + + verify(mWindowMagnificationSettings).showSettingPanel(eq(mode)); + } + + @Test + public void testHideSettingsPanel() { + mMagnificationSettingsController.closeMagnificationSettings(); + + verify(mWindowMagnificationSettings).hideSettingPanel(); + } + + @Test + public void testOnConfigurationChanged_notifySettingsPanel() { + mMagnificationSettingsController.onConfigurationChanged(ActivityInfo.CONFIG_DENSITY); + + verify(mWindowMagnificationSettings).onConfigurationChanged(ActivityInfo.CONFIG_DENSITY); + } + + @Test + public void testPanelOnSetDiagonalScrolling_delegateToCallback() { + final boolean enable = true; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onSetDiagonalScrolling(enable); + + verify(mMagnificationSettingControllerCallback).onSetDiagonalScrolling( + eq(mContext.getDisplayId()), eq(enable)); + } + + @Test + public void testPanelOnModeSwitch_delegateToCallback() { + final int newMode = ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onModeSwitch(newMode); + + verify(mMagnificationSettingControllerCallback).onModeSwitch( + eq(mContext.getDisplayId()), eq(newMode)); + } + + @Test + public void testPanelOnSettingsPanelVisibilityChanged_delegateToCallback() { + final boolean shown = true; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onSettingsPanelVisibilityChanged(shown); + + verify(mMagnificationSettingControllerCallback).onSettingsPanelVisibilityChanged( + eq(mContext.getDisplayId()), eq(shown)); + } + + @Test + public void testPanelOnSetMagnifierSize_delegateToCallback() { + final @MagnificationSize int index = MagnificationSize.SMALL; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onSetMagnifierSize(index); + + verify(mMagnificationSettingControllerCallback).onSetMagnifierSize( + eq(mContext.getDisplayId()), eq(index)); + } + + @Test + public void testPanelOnEditMagnifierSizeMode_delegateToCallback() { + final boolean enable = true; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onEditMagnifierSizeMode(enable); + + verify(mMagnificationSettingControllerCallback).onEditMagnifierSizeMode( + eq(mContext.getDisplayId()), eq(enable)); + } + + @Test + public void testPanelOnMagnifierScale_delegateToCallback() { + final float scale = 3.0f; + mMagnificationSettingsController.mWindowMagnificationSettingsCallback + .onMagnifierScale(scale); + + verify(mMagnificationSettingControllerCallback).onMagnifierScale( + eq(mContext.getDisplayId()), eq(scale)); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/ModeSwitchesControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/ModeSwitchesControllerTest.java index 82ae6ff1e945..3c974232990a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/ModeSwitchesControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/ModeSwitchesControllerTest.java @@ -49,7 +49,7 @@ public class ModeSwitchesControllerTest extends SysuiTestCase { private ModeSwitchesController mModeSwitchesController; private View mSpyView; @Mock - private MagnificationModeSwitch.SwitchListener mListener; + private MagnificationModeSwitch.ClickListener mListener; @Before @@ -57,7 +57,7 @@ public class ModeSwitchesControllerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mSupplier = new FakeSwitchSupplier(mContext.getSystemService(DisplayManager.class)); mModeSwitchesController = new ModeSwitchesController(mSupplier); - mModeSwitchesController.setSwitchListenerDelegate(mListener); + mModeSwitchesController.setClickListenerDelegate(mListener); mModeSwitch = Mockito.spy(new MagnificationModeSwitch(mContext, mModeSwitchesController)); mSpyView = Mockito.spy(new View(mContext)); } @@ -101,8 +101,7 @@ public class ModeSwitchesControllerTest extends SysuiTestCase { mModeSwitch.onSingleTap(mSpyView); - verify(mListener).onSwitch(mContext.getDisplayId(), - Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + verify(mListener).onClick(mContext.getDisplayId()); } private class FakeSwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java index de152e4a93d8..b5e0df5d733c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java @@ -790,7 +790,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { // should move with both offsetX and offsetY without regrading offsetY/offsetX mInstrumentation.runOnMainSync( () -> { - mController.getMagnificationSettings().setDiagonalScrolling(true); + mController.setDiagonalScrolling(true); mController.moveWindowMagnifier(offsetX, offsetY); }); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java index 6e4a20aaf6fe..0978c824cb15 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -640,6 +640,10 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { assertTrue( mirrorView.performAccessibilityAction(R.id.accessibility_action_move_left, null)); verify(mWindowMagnifierCallback, times(4)).onMove(eq(displayId)); + + assertTrue(mirrorView.performAccessibilityAction( + AccessibilityAction.ACTION_CLICK.getId(), null)); + verify(mWindowMagnifierCallback).onClickSettingsButton(eq(displayId)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java index 47c91911e52a..c08b5b47cb06 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java @@ -16,6 +16,9 @@ package com.android.systemui.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; + import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; @@ -34,7 +37,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; +import android.widget.Button; import android.widget.CompoundButton; +import android.widget.LinearLayout; import androidx.test.filters.SmallTest; @@ -97,7 +102,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_hasAccessibilityWindowTitle() { - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); final WindowManager.LayoutParams layoutPrams = mWindowManager.getLayoutParamsFromAttachedView(); @@ -108,51 +113,77 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { } @Test - public void performClick_smallSizeButton_changeMagnifierSizeSmall() { + public void showSettingPanel_windowMode_showEditButtonAndDiagonalView() { + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + + final Button editButton = getInternalView(R.id.magnifier_edit_button); + assertEquals(editButton.getVisibility(), View.VISIBLE); + + final LinearLayout diagonalView = getInternalView(R.id.magnifier_horizontal_lock_view); + assertEquals(diagonalView.getVisibility(), View.VISIBLE); + } + + @Test + public void showSettingPanel_fullScreenMode_hideEditButtonAndDiagonalView() { + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + + final Button editButton = getInternalView(R.id.magnifier_edit_button); + assertEquals(editButton.getVisibility(), View.INVISIBLE); + + final LinearLayout diagonalView = getInternalView(R.id.magnifier_horizontal_lock_view); + assertEquals(diagonalView.getVisibility(), View.GONE); + } + + @Test + public void performClick_smallSizeButton_changeMagnifierSizeSmallAndSwitchToWindowMode() { // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - verifyOnSetMagnifierSize(R.id.magnifier_small_button, MAGNIFICATION_SIZE_SMALL); + verifyOnSetMagnifierSizeAndOnModeSwitch( + R.id.magnifier_small_button, MAGNIFICATION_SIZE_SMALL); } @Test - public void performClick_mediumSizeButton_changeMagnifierSizeMedium() { + public void performClick_mediumSizeButton_changeMagnifierSizeMediumAndSwitchToWindowMode() { // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - verifyOnSetMagnifierSize(R.id.magnifier_medium_button, MAGNIFICATION_SIZE_MEDIUM); + verifyOnSetMagnifierSizeAndOnModeSwitch( + R.id.magnifier_medium_button, MAGNIFICATION_SIZE_MEDIUM); } @Test - public void performClick_largeSizeButton_changeMagnifierSizeLarge() { + public void performClick_largeSizeButton_changeMagnifierSizeLargeAndSwitchToWindowMode() { // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - verifyOnSetMagnifierSize(R.id.magnifier_large_button, MAGNIFICATION_SIZE_LARGE); + verifyOnSetMagnifierSizeAndOnModeSwitch( + R.id.magnifier_large_button, MAGNIFICATION_SIZE_LARGE); } - private void verifyOnSetMagnifierSize(@IdRes int viewId, int expectedSizeIndex) { + private void verifyOnSetMagnifierSizeAndOnModeSwitch(@IdRes int viewId, int expectedSizeIndex) { View changeSizeButton = getInternalView(viewId); // Perform click changeSizeButton.performClick(); verify(mWindowMagnificationSettingsCallback).onSetMagnifierSize(expectedSizeIndex); + verify(mWindowMagnificationSettingsCallback) + .onModeSwitch(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Test - public void performClick_fullScreenModeButton_setEditMagnifierSizeMode() { + public void performClick_fullScreenModeButton_switchToFullScreenMode() { View fullScreenModeButton = getInternalView(R.id.magnifier_full_button); getInternalView(R.id.magnifier_panel_view); // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); // Perform click fullScreenModeButton.performClick(); - verify(mWindowManager).removeView(mSettingView); verify(mWindowMagnificationSettingsCallback) .onModeSwitch(Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); } @@ -162,7 +193,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { View editButton = getInternalView(R.id.magnifier_edit_button); // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); // Perform click editButton.performClick(); @@ -178,7 +209,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { final boolean currentCheckedState = diagonalScrollingSwitch.isChecked(); // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); // Perform click diagonalScrollingSwitch.performClick(); @@ -189,7 +220,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void onConfigurationChanged_selectedButtonIsStillSelected() { // Open view - mWindowMagnificationSettings.showSettingPanel(); + mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); View magnifierMediumButton = getInternalView(R.id.magnifier_medium_button); magnifierMediumButton.performClick(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java index 583f2db20570..239b5bd39430 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -16,16 +16,21 @@ package com.android.systemui.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; + +import static com.android.systemui.accessibility.WindowMagnificationSettings.MagnificationSize; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_MAGNIFICATION_OVERLAP; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.ArgumentMatchers.notNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -80,6 +85,11 @@ public class WindowMagnificationTest extends SysuiTestCase { private OverviewProxyListener mOverviewProxyListener; private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); + @Mock + private WindowMagnificationController mWindowMagnificationController; + @Mock + private MagnificationSettingsController mMagnificationSettingsController; + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -96,7 +106,12 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue = new CommandQueue(getContext(), mDisplayTracker); mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, - mSysUiState, mOverviewProxyService, mSecureSettings, mDisplayTracker); + mSysUiState, mOverviewProxyService, mSecureSettings, mDisplayTracker, + getContext().getSystemService(DisplayManager.class)); + mWindowMagnification.mMagnificationControllerSupplier = new FakeControllerSupplier( + mContext.getSystemService(DisplayManager.class), mWindowMagnificationController); + mWindowMagnification.mMagnificationSettingsSupplier = new FakeSettingsSupplier( + mContext.getSystemService(DisplayManager.class), mMagnificationSettingsController); mWindowMagnification.start(); final ArgumentCaptor<OverviewProxyListener> listenerArgumentCaptor = @@ -112,13 +127,11 @@ public class WindowMagnificationTest extends SysuiTestCase { verify(mAccessibilityManager).setWindowMagnificationConnection(any( IWindowMagnificationConnection.class)); - verify(mModeSwitchesController).setSwitchListenerDelegate(notNull()); mCommandQueue.requestWindowMagnificationConnection(false); waitForIdleSync(); verify(mAccessibilityManager).setWindowMagnificationConnection(isNull()); - verify(mModeSwitchesController).setSwitchListenerDelegate(isNull()); } @Test @@ -127,7 +140,8 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onWindowMagnifierBoundsChanged(TEST_DISPLAY, testBounds); + mWindowMagnification.mWindowMagnifierCallback + .onWindowMagnifierBoundsChanged(TEST_DISPLAY, testBounds); verify(mConnectionCallback).onWindowMagnifierBoundsChanged(TEST_DISPLAY, testBounds); } @@ -138,7 +152,8 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onPerformScaleAction(TEST_DISPLAY, newScale); + mWindowMagnification.mWindowMagnifierCallback + .onPerformScaleAction(TEST_DISPLAY, newScale); verify(mConnectionCallback).onPerformScaleAction(TEST_DISPLAY, newScale); } @@ -148,7 +163,8 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onAccessibilityActionPerformed(TEST_DISPLAY); + mWindowMagnification.mWindowMagnifierCallback + .onAccessibilityActionPerformed(TEST_DISPLAY); verify(mConnectionCallback).onAccessibilityActionPerformed(TEST_DISPLAY); } @@ -158,21 +174,101 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onMove(TEST_DISPLAY); + mWindowMagnification.mWindowMagnifierCallback.onMove(TEST_DISPLAY); verify(mConnectionCallback).onMove(TEST_DISPLAY); } @Test - public void onModeSwitch_enabled_notifyCallback() throws RemoteException { - final int magnificationModeFullScreen = 1; + public void onClickSettingsButton_enabled_showPanelForWindowMode() { + mWindowMagnification.mWindowMagnifierCallback.onClickSettingsButton(TEST_DISPLAY); + waitForIdleSync(); + + verify(mMagnificationSettingsController).showMagnificationSettings( + eq(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW)); + } + + @Test + public void onSetMagnifierSize_delegateToMagnifier() { + final @MagnificationSize int index = MagnificationSize.SMALL; + mWindowMagnification.mMagnificationSettingsControllerCallback.onSetMagnifierSize( + TEST_DISPLAY, index); + waitForIdleSync(); + + verify(mWindowMagnificationController).changeMagnificationSize(eq(index)); + } + + @Test + public void onSetDiagonalScrolling_delegateToMagnifier() { + mWindowMagnification.mMagnificationSettingsControllerCallback.onSetDiagonalScrolling( + TEST_DISPLAY, /* enable= */ true); + waitForIdleSync(); + + verify(mWindowMagnificationController).setDiagonalScrolling(eq(true)); + } + + @Test + public void onEditMagnifierSizeMode_windowActivated_delegateToMagnifier() { + when(mWindowMagnificationController.isActivated()).thenReturn(true); + mWindowMagnification.mMagnificationSettingsControllerCallback.onEditMagnifierSizeMode( + TEST_DISPLAY, /* enable= */ true); + waitForIdleSync(); + + verify(mWindowMagnificationController).setEditMagnifierSizeMode(eq(true)); + } + + @Test + public void onMagnifierScale_notifyCallback() throws RemoteException { + mCommandQueue.requestWindowMagnificationConnection(true); + waitForIdleSync(); + final float scale = 3.0f; + mWindowMagnification.mMagnificationSettingsControllerCallback.onMagnifierScale( + TEST_DISPLAY, scale); + + verify(mConnectionCallback).onPerformScaleAction(eq(TEST_DISPLAY), eq(scale)); + } + + @Test + public void onModeSwitch_windowEnabledAndSwitchToFullscreen_hidePanelAndNotifyCallback() + throws RemoteException { + when(mWindowMagnificationController.isActivated()).thenReturn(true); + mCommandQueue.requestWindowMagnificationConnection(true); + waitForIdleSync(); + + mWindowMagnification.mMagnificationSettingsControllerCallback.onModeSwitch( + TEST_DISPLAY, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + waitForIdleSync(); + + verify(mMagnificationSettingsController).closeMagnificationSettings(); + verify(mConnectionCallback).onChangeMagnificationMode(eq(TEST_DISPLAY), + eq(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN)); + } + + @Test + public void onModeSwitch_switchToSameMode_doNothing() + throws RemoteException { + when(mWindowMagnificationController.isActivated()).thenReturn(true); mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onModeSwitch(TEST_DISPLAY, magnificationModeFullScreen); + mWindowMagnification.mMagnificationSettingsControllerCallback.onModeSwitch( + TEST_DISPLAY, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + waitForIdleSync(); + + verify(mMagnificationSettingsController, never()).closeMagnificationSettings(); + verify(mConnectionCallback, never()).onChangeMagnificationMode(eq(TEST_DISPLAY), + /* magnificationMode = */ anyInt()); + } + + @Test + public void onSettingsPanelVisibilityChanged_windowActivated_delegateToMagnifier() { + when(mWindowMagnificationController.isActivated()).thenReturn(true); + final boolean shown = false; + mWindowMagnification.mMagnificationSettingsControllerCallback + .onSettingsPanelVisibilityChanged(TEST_DISPLAY, shown); + waitForIdleSync(); - verify(mConnectionCallback).onChangeMagnificationMode(TEST_DISPLAY, - magnificationModeFullScreen); + verify(mWindowMagnificationController).updateDragHandleResourcesIfNeeded(eq(shown)); } @Test @@ -211,4 +307,21 @@ public class WindowMagnificationTest extends SysuiTestCase { return mController; } } + + private static class FakeSettingsSupplier extends + DisplayIdIndexSupplier<MagnificationSettingsController> { + + private final MagnificationSettingsController mController; + + FakeSettingsSupplier(DisplayManager displayManager, + MagnificationSettingsController controller) { + super(displayManager); + mController = controller; + } + + @Override + protected MagnificationSettingsController createInstance(Display display) { + return mController; + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt index 6e423593b379..a245c01d74de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt @@ -17,14 +17,14 @@ package com.android.systemui.biometrics import android.graphics.Point -import android.hardware.biometrics.BiometricSourceType.FACE -import android.hardware.biometrics.BiometricSourceType.FINGERPRINT +import android.hardware.biometrics.BiometricSourceType import android.hardware.fingerprint.FingerprintSensorPropertiesInternal import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.keyguard.logging.KeyguardLogger import com.android.systemui.SysuiTestCase import com.android.systemui.dump.logcatLogBuffer @@ -36,11 +36,11 @@ import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.leak.RotationUtils import com.android.systemui.util.mockito.any -import javax.inject.Provider import org.junit.After import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -50,15 +50,15 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers.eq -import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito.`when` import org.mockito.Mockito.never import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.mockito.MockitoSession import org.mockito.quality.Strictness +import javax.inject.Provider @SmallTest @RunWith(AndroidTestingRunner::class) @@ -75,6 +75,7 @@ class AuthRippleControllerTest : SysuiTestCase() { @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController + @Mock private lateinit var bypassController: KeyguardBypassController @Mock private lateinit var biometricUnlockController: BiometricUnlockController @Mock private lateinit var udfpsControllerProvider: Provider<UdfpsController> @Mock private lateinit var udfpsController: UdfpsController @@ -83,15 +84,10 @@ class AuthRippleControllerTest : SysuiTestCase() { @Mock private lateinit var lightRevealScrim: LightRevealScrim @Mock private lateinit var fpSensorProp: FingerprintSensorPropertiesInternal - @Captor - private lateinit var biometricModeListener: - ArgumentCaptor<BiometricUnlockController.BiometricModeListener> - @Before fun setUp() { MockitoAnnotations.initMocks(this) - staticMockSession = - mockitoSession() + staticMockSession = mockitoSession() .mockStatic(RotationUtils::class.java) .strictness(Strictness.LENIENT) .startMocking() @@ -100,24 +96,24 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(authController.udfpsProps).thenReturn(listOf(fpSensorProp)) `when`(udfpsControllerProvider.get()).thenReturn(udfpsController) - controller = - AuthRippleController( - mCentralSurfaces, - context, - authController, - configurationController, - keyguardUpdateMonitor, - keyguardStateController, - wakefulnessLifecycle, - commandRegistry, - notificationShadeWindowController, - biometricUnlockController, - udfpsControllerProvider, - statusBarStateController, - featureFlags, - KeyguardLogger(logcatLogBuffer(AuthRippleController.TAG)), - rippleView - ) + controller = AuthRippleController( + mCentralSurfaces, + context, + authController, + configurationController, + keyguardUpdateMonitor, + keyguardStateController, + wakefulnessLifecycle, + commandRegistry, + notificationShadeWindowController, + bypassController, + biometricUnlockController, + udfpsControllerProvider, + statusBarStateController, + featureFlags, + KeyguardLogger(logcatLogBuffer(AuthRippleController.TAG)), + rippleView + ) controller.init() `when`(mCentralSurfaces.lightRevealScrim).thenReturn(lightRevealScrim) } @@ -134,14 +130,16 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(authController.fingerprintSensorLocation).thenReturn(fpsLocation) controller.onViewAttached() `when`(keyguardStateController.isShowing).thenReturn(true) - `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(eq(FINGERPRINT))) - .thenReturn(true) - `when`(biometricUnlockController.isBiometricUnlock).thenReturn(true) - `when`(biometricUnlockController.biometricType).thenReturn(FINGERPRINT) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + eq(BiometricSourceType.FINGERPRINT))).thenReturn(true) - // WHEN unlocked with fingerprint - verify(biometricUnlockController).addBiometricModeListener(biometricModeListener.capture()) - biometricModeListener.value.onModeChanged(/* mode= */ 0) + // WHEN fingerprint authenticated + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FINGERPRINT /* type */, + false /* isStrongBiometric */) // THEN update sensor location and show ripple verify(rippleView).setFingerprintSensorLocation(fpsLocation, 0f) @@ -154,15 +152,17 @@ class AuthRippleControllerTest : SysuiTestCase() { val fpsLocation = Point(5, 5) `when`(authController.udfpsLocation).thenReturn(fpsLocation) controller.onViewAttached() - `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(eq(FINGERPRINT))) - .thenReturn(true) - `when`(biometricUnlockController.isBiometricUnlock).thenReturn(true) - `when`(biometricUnlockController.biometricType).thenReturn(FINGERPRINT) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + eq(BiometricSourceType.FINGERPRINT))).thenReturn(true) // WHEN keyguard is NOT showing & fingerprint authenticated `when`(keyguardStateController.isShowing).thenReturn(false) - verify(biometricUnlockController).addBiometricModeListener(biometricModeListener.capture()) - biometricModeListener.value.onModeChanged(/* mode= */ 0) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FINGERPRINT /* type */, + false /* isStrongBiometric */) // THEN no ripple verify(rippleView, never()).startUnlockedRipple(any()) @@ -175,14 +175,61 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(authController.udfpsLocation).thenReturn(fpsLocation) controller.onViewAttached() `when`(keyguardStateController.isShowing).thenReturn(true) - `when`(biometricUnlockController.isBiometricUnlock).thenReturn(true) - `when`(biometricUnlockController.biometricType).thenReturn(FINGERPRINT) // WHEN unlocking with fingerprint is NOT allowed & fingerprint authenticated - `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(eq(FINGERPRINT))) - .thenReturn(false) - verify(biometricUnlockController).addBiometricModeListener(biometricModeListener.capture()) - biometricModeListener.value.onModeChanged(/* mode= */ 0) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + eq(BiometricSourceType.FINGERPRINT))).thenReturn(false) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FINGERPRINT /* type */, + false /* isStrongBiometric */) + + // THEN no ripple + verify(rippleView, never()).startUnlockedRipple(any()) + } + + @Test + fun testFaceTriggerBypassEnabled_Ripple() { + // GIVEN face auth sensor exists, keyguard is showing & unlocking with face is allowed + val faceLocation = Point(5, 5) + `when`(authController.faceSensorLocation).thenReturn(faceLocation) + controller.onViewAttached() + + `when`(keyguardStateController.isShowing).thenReturn(true) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + BiometricSourceType.FACE)).thenReturn(true) + + // WHEN bypass is enabled & face authenticated + `when`(bypassController.canBypass()).thenReturn(true) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FACE /* type */, + false /* isStrongBiometric */) + + // THEN show ripple + verify(rippleView).setSensorLocation(faceLocation) + verify(rippleView).startUnlockedRipple(any()) + } + + @Test + fun testFaceTriggerNonBypass_NoRipple() { + // GIVEN face auth sensor exists + val faceLocation = Point(5, 5) + `when`(authController.faceSensorLocation).thenReturn(faceLocation) + controller.onViewAttached() + + // WHEN bypass isn't enabled & face authenticated + `when`(bypassController.canBypass()).thenReturn(false) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FACE /* type */, + false /* isStrongBiometric */) // THEN no ripple verify(rippleView, never()).startUnlockedRipple(any()) @@ -192,12 +239,14 @@ class AuthRippleControllerTest : SysuiTestCase() { fun testNullFaceSensorLocationDoesNothing() { `when`(authController.faceSensorLocation).thenReturn(null) controller.onViewAttached() - `when`(biometricUnlockController.biometricType).thenReturn(FACE) - `when`(biometricUnlockController.isBiometricUnlock).thenReturn(true) - verify(biometricUnlockController).addBiometricModeListener(biometricModeListener.capture()) - biometricModeListener.value.onModeChanged(/* mode= */ 0) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FACE /* type */, + false /* isStrongBiometric */) verify(rippleView, never()).startUnlockedRipple(any()) } @@ -205,21 +254,25 @@ class AuthRippleControllerTest : SysuiTestCase() { fun testNullFingerprintSensorLocationDoesNothing() { `when`(authController.fingerprintSensorLocation).thenReturn(null) controller.onViewAttached() - `when`(biometricUnlockController.biometricType).thenReturn(FINGERPRINT) - `when`(biometricUnlockController.isBiometricUnlock).thenReturn(true) - verify(biometricUnlockController).addBiometricModeListener(biometricModeListener.capture()) - biometricModeListener.value.onModeChanged(/* mode= */ 0) + val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) + verify(keyguardUpdateMonitor).registerCallback(captor.capture()) + captor.value.onBiometricAuthenticated( + 0 /* userId */, + BiometricSourceType.FINGERPRINT /* type */, + false /* isStrongBiometric */) verify(rippleView, never()).startUnlockedRipple(any()) } @Test fun registersAndDeregisters() { controller.onViewAttached() - val captor = ArgumentCaptor.forClass(KeyguardStateController.Callback::class.java) + val captor = ArgumentCaptor + .forClass(KeyguardStateController.Callback::class.java) verify(keyguardStateController).addCallback(captor.capture()) - val captor2 = ArgumentCaptor.forClass(WakefulnessLifecycle.Observer::class.java) + val captor2 = ArgumentCaptor + .forClass(WakefulnessLifecycle.Observer::class.java) verify(wakefulnessLifecycle).addObserver(captor2.capture()) controller.onViewDetached() verify(keyguardStateController).removeCallback(any()) @@ -233,20 +286,17 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(authController.fingerprintSensorLocation).thenReturn(fpsLocation) controller.onViewAttached() `when`(keyguardStateController.isShowing).thenReturn(true) - `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(FINGERPRINT)).thenReturn(true) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + BiometricSourceType.FINGERPRINT)).thenReturn(true) `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(true) - controller.showUnlockRipple(FINGERPRINT) - assertTrue( - "reveal didn't start on keyguardFadingAway", - controller.startLightRevealScrimOnKeyguardFadingAway - ) + controller.showUnlockRipple(BiometricSourceType.FINGERPRINT) + assertTrue("reveal didn't start on keyguardFadingAway", + controller.startLightRevealScrimOnKeyguardFadingAway) `when`(keyguardStateController.isKeyguardFadingAway).thenReturn(true) controller.onKeyguardFadingAwayChanged() - assertFalse( - "reveal triggers multiple times", - controller.startLightRevealScrimOnKeyguardFadingAway - ) + assertFalse("reveal triggers multiple times", + controller.startLightRevealScrimOnKeyguardFadingAway) } @Test @@ -258,26 +308,23 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(keyguardStateController.isShowing).thenReturn(true) `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(true) `when`(authController.isUdfpsFingerDown).thenReturn(true) - `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(eq(FACE))).thenReturn(true) + `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed( + eq(BiometricSourceType.FACE))).thenReturn(true) - controller.showUnlockRipple(FACE) - assertTrue( - "reveal didn't start on keyguardFadingAway", - controller.startLightRevealScrimOnKeyguardFadingAway - ) + controller.showUnlockRipple(BiometricSourceType.FACE) + assertTrue("reveal didn't start on keyguardFadingAway", + controller.startLightRevealScrimOnKeyguardFadingAway) `when`(keyguardStateController.isKeyguardFadingAway).thenReturn(true) controller.onKeyguardFadingAwayChanged() - assertFalse( - "reveal triggers multiple times", - controller.startLightRevealScrimOnKeyguardFadingAway - ) + assertFalse("reveal triggers multiple times", + controller.startLightRevealScrimOnKeyguardFadingAway) } @Test fun testUpdateRippleColor() { controller.onViewAttached() - val captor = - ArgumentCaptor.forClass(ConfigurationController.ConfigurationListener::class.java) + val captor = ArgumentCaptor + .forClass(ConfigurationController.ConfigurationListener::class.java) verify(configurationController).addCallback(captor.capture()) reset(rippleView) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt index 3eb82a7d69bb..94489adc1bd4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt @@ -1,19 +1,22 @@ package com.android.systemui.biometrics.domain.interactor +import android.hardware.biometrics.AuthenticateOptions import android.hardware.biometrics.IBiometricContextListener import android.hardware.biometrics.IBiometricContextListener.FoldState import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionState +import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING import com.android.systemui.unfold.updates.FoldStateProvider -import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.withArgCaptor import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -38,66 +41,125 @@ class LogContextInteractorImplTest : SysuiTestCase() { private val testScope = TestScope() - @Mock private lateinit var statusBarStateController: StatusBarStateController - @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock private lateinit var foldProvider: FoldStateProvider + private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository + private lateinit var interactor: LogContextInteractorImpl @Before fun setup() { + keyguardTransitionRepository = FakeKeyguardTransitionRepository() interactor = LogContextInteractorImpl( testScope.backgroundScope, - statusBarStateController, - wakefulnessLifecycle, - foldProvider + foldProvider, + KeyguardTransitionInteractor( + keyguardTransitionRepository, + ), ) } @Test - fun isDozingChanges() = + fun isAodChanges() = testScope.runTest { - whenever(statusBarStateController.isDozing).thenReturn(true) + val isAod = collectLastValue(interactor.isAod) - val isDozing = collectLastValue(interactor.isDozing) - runCurrent() - val listener = statusBarStateController.captureListener() + keyguardTransitionRepository.startTransitionTo(KeyguardState.OFF) + assertThat(isAod()).isFalse() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.DOZING) + assertThat(isAod()).isFalse() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.DREAMING) + assertThat(isAod()).isFalse() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD) + assertThat(isAod()).isTrue() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) + assertThat(isAod()).isFalse() - assertThat(isDozing()).isTrue() + keyguardTransitionRepository.startTransitionTo(KeyguardState.PRIMARY_BOUNCER) + assertThat(isAod()).isFalse() - listener.onDozingChanged(true) - listener.onDozingChanged(true) - listener.onDozingChanged(false) + keyguardTransitionRepository.startTransitionTo(KeyguardState.LOCKSCREEN) + assertThat(isAod()).isFalse() - assertThat(isDozing()).isFalse() + keyguardTransitionRepository.startTransitionTo(KeyguardState.GONE) + assertThat(isAod()).isFalse() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.OCCLUDED) + assertThat(isAod()).isFalse() } @Test fun isAwakeChanges() = testScope.runTest { - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE) - val isAwake = collectLastValue(interactor.isAwake) - runCurrent() - val listener = wakefulnessLifecycle.captureObserver() - assertThat(isAwake()).isTrue() + keyguardTransitionRepository.startTransitionTo(KeyguardState.OFF) + assertThat(isAwake()).isFalse() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.DOZING) + assertThat(isAwake()).isFalse() - listener.onStartedGoingToSleep() - listener.onFinishedGoingToSleep() - listener.onStartedWakingUp() + keyguardTransitionRepository.startTransitionTo(KeyguardState.DREAMING) + assertThat(isAwake()).isTrue() + keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD) assertThat(isAwake()).isFalse() - listener.onFinishedWakingUp() - listener.onPostFinishedWakingUp() + keyguardTransitionRepository.startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) + assertThat(isAwake()).isTrue() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.PRIMARY_BOUNCER) + assertThat(isAwake()).isTrue() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.LOCKSCREEN) + assertThat(isAwake()).isTrue() + + keyguardTransitionRepository.startTransitionTo(KeyguardState.GONE) + assertThat(isAwake()).isTrue() + keyguardTransitionRepository.startTransitionTo(KeyguardState.OCCLUDED) assertThat(isAwake()).isTrue() } @Test + fun displayStateChanges() = + testScope.runTest { + val displayState = collectLastValue(interactor.displayState) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.OFF) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_NO_UI) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.DOZING) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_NO_UI) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.DREAMING) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_SCREENSAVER) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_AOD) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.PRIMARY_BOUNCER) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.LOCKSCREEN) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.GONE) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_UNKNOWN) + + keyguardTransitionRepository.startTransitionTo(KeyguardState.OCCLUDED) + assertThat(displayState()).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) + } + + @Test fun foldStateChanges() = testScope.runTest { val foldState = collectLastValue(interactor.foldState) @@ -123,74 +185,66 @@ class LogContextInteractorImplTest : SysuiTestCase() { @Test fun contextSubscriberChanges() = testScope.runTest { - whenever(statusBarStateController.isDozing).thenReturn(false) - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE) runCurrent() - val foldListener = foldProvider.captureListener() foldListener.onFoldUpdate(FOLD_UPDATE_START_CLOSING) foldListener.onFoldUpdate(FOLD_UPDATE_FINISH_CLOSED) + keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD) - var dozing: Boolean? = null + var aod: Boolean? = null var awake: Boolean? = null var folded: Int? = null + var displayState: Int? = null val job = interactor.addBiometricContextListener( object : IBiometricContextListener.Stub() { - override fun onDozeChanged(isDozing: Boolean, isAwake: Boolean) { - dozing = isDozing + override fun onDozeChanged(isAod: Boolean, isAwake: Boolean) { + aod = isAod awake = isAwake } override fun onFoldChanged(foldState: Int) { folded = foldState } + + override fun onDisplayStateChanged(newDisplayState: Int) { + displayState = newDisplayState + } } ) runCurrent() - val statusBarStateListener = statusBarStateController.captureListener() - val wakefullnessObserver = wakefulnessLifecycle.captureObserver() - - assertThat(dozing).isFalse() - assertThat(awake).isTrue() + assertThat(aod).isTrue() + assertThat(awake).isFalse() assertThat(folded).isEqualTo(FoldState.FULLY_CLOSED) + assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_AOD) - statusBarStateListener.onDozingChanged(true) - wakefullnessObserver.onStartedGoingToSleep() foldListener.onFoldUpdate(FOLD_UPDATE_START_OPENING) foldListener.onFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN) - wakefullnessObserver.onFinishedGoingToSleep() + keyguardTransitionRepository.startTransitionTo(KeyguardState.LOCKSCREEN) runCurrent() - assertThat(dozing).isTrue() - assertThat(awake).isFalse() + assertThat(aod).isFalse() + assertThat(awake).isTrue() assertThat(folded).isEqualTo(FoldState.HALF_OPENED) + assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) job.cancel() // stale updates should be ignored - statusBarStateListener.onDozingChanged(false) - wakefullnessObserver.onFinishedWakingUp() foldListener.onFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) + keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD) runCurrent() - assertThat(dozing).isTrue() - assertThat(awake).isFalse() + assertThat(aod).isFalse() + assertThat(awake).isTrue() assertThat(folded).isEqualTo(FoldState.HALF_OPENED) + assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN) } } -private fun StatusBarStateController.captureListener() = - withArgCaptor<StatusBarStateController.StateListener> { - verify(this@captureListener).addCallback(capture()) - } - -private fun WakefulnessLifecycle.captureObserver() = - withArgCaptor<WakefulnessLifecycle.Observer> { - verify(this@captureObserver).addObserver(capture()) - } +private suspend fun FakeKeyguardTransitionRepository.startTransitionTo(newState: KeyguardState) = + sendTransitionStep(TransitionStep(to = newState, transitionState = TransitionState.STARTED)) private fun FoldStateProvider.captureListener() = withArgCaptor<FoldStateProvider.FoldUpdatesListener> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastSenderTest.kt index fbd2c918648a..8e8172757cbe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastSenderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastSenderTest.kt @@ -30,7 +30,6 @@ import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -126,13 +125,10 @@ class BroadcastSenderTest : SysuiTestCase() { @Test fun sendCloseSystemDialogs_dispatchesWithWakelock() { - val intentCaptor = ArgumentCaptor.forClass(Intent::class.java) - broadcastSender.closeSystemDialogs() runExecutorAssertingWakelock { - verify(mockContext).sendBroadcast(intentCaptor.capture()) - assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) + verify(mockContext).closeSystemDialogs() } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java index 94cf384267ad..925461765546 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java @@ -50,7 +50,7 @@ public class ClassifierTest extends SysuiTestCase { displayMetrics.widthPixels = 1000; displayMetrics.heightPixels = 1000; mDataProvider = new FalsingDataProvider( - displayMetrics, mBatteryController, mFoldStateListener, mDockManager); + displayMetrics, mBatteryController, mFoldStateListener, mDockManager, false); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java index 8eadadff1ca5..7e066808b5bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java @@ -54,18 +54,18 @@ public class FalsingDataProviderTest extends ClassifierTest { @Mock private FoldStateListener mFoldStateListener; private final DockManagerFake mDockManager = new DockManagerFake(); + private DisplayMetrics mDisplayMetrics; @Before public void setup() { super.setup(); MockitoAnnotations.initMocks(this); - DisplayMetrics displayMetrics = new DisplayMetrics(); - displayMetrics.xdpi = 100; - displayMetrics.ydpi = 100; - displayMetrics.widthPixels = 1000; - displayMetrics.heightPixels = 1000; - mDataProvider = new FalsingDataProvider( - displayMetrics, mBatteryController, mFoldStateListener, mDockManager); + mDisplayMetrics = new DisplayMetrics(); + mDisplayMetrics.xdpi = 100; + mDisplayMetrics.ydpi = 100; + mDisplayMetrics.widthPixels = 1000; + mDisplayMetrics.heightPixels = 1000; + mDataProvider = createWithFoldCapability(false); } @After @@ -345,20 +345,42 @@ public class FalsingDataProviderTest extends ClassifierTest { } @Test - public void test_FoldedState_Folded() { + public void test_UnfoldedState_Folded() { + FalsingDataProvider falsingDataProvider = createWithFoldCapability(true); when(mFoldStateListener.getFolded()).thenReturn(true); - assertThat(mDataProvider.isUnfolded()).isFalse(); + assertThat(falsingDataProvider.isUnfolded()).isFalse(); } @Test - public void test_FoldedState_Unfolded() { + public void test_UnfoldedState_Unfolded() { + FalsingDataProvider falsingDataProvider = createWithFoldCapability(true); when(mFoldStateListener.getFolded()).thenReturn(false); - assertThat(mDataProvider.isUnfolded()).isTrue(); + assertThat(falsingDataProvider.isUnfolded()).isTrue(); } @Test - public void test_FoldedState_NotFoldable() { + public void test_Nonfoldabled_TrueFoldState() { + FalsingDataProvider falsingDataProvider = createWithFoldCapability(false); + when(mFoldStateListener.getFolded()).thenReturn(true); + assertThat(falsingDataProvider.isUnfolded()).isFalse(); + } + + @Test + public void test_Nonfoldabled_FalseFoldState() { + FalsingDataProvider falsingDataProvider = createWithFoldCapability(false); + when(mFoldStateListener.getFolded()).thenReturn(false); + assertThat(falsingDataProvider.isUnfolded()).isFalse(); + } + + @Test + public void test_Nonfoldabled_NullFoldState() { + FalsingDataProvider falsingDataProvider = createWithFoldCapability(true); when(mFoldStateListener.getFolded()).thenReturn(null); - assertThat(mDataProvider.isUnfolded()).isFalse(); + assertThat(falsingDataProvider.isUnfolded()).isFalse(); + } + + private FalsingDataProvider createWithFoldCapability(boolean foldable) { + return new FalsingDataProvider( + mDisplayMetrics, mBatteryController, mFoldStateListener, mDockManager, foldable); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt index bd7e98e16b91..8f65fc8c3930 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt @@ -17,13 +17,18 @@ package com.android.systemui.controls.start +import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.pm.ApplicationInfo import android.content.pm.ServiceInfo +import android.os.UserManager import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent @@ -34,14 +39,20 @@ import com.android.systemui.controls.ui.SelectedItem import com.android.systemui.settings.UserTracker import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat import java.util.Optional import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.anyInt import org.mockito.Mockito.doAnswer import org.mockito.Mockito.doReturn import org.mockito.Mockito.never @@ -58,6 +69,8 @@ class ControlsStartableTest : SysuiTestCase() { @Mock private lateinit var controlsListingController: ControlsListingController @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository + @Mock private lateinit var userManager: UserManager + @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher private val preferredPanelsRepository = FakeSelectedComponentRepository() @@ -67,13 +80,27 @@ class ControlsStartableTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf()) + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true) fakeExecutor = FakeExecutor(FakeSystemClock()) } @Test fun testDisabledNothingIsCalled() { - createStartable(enabled = false).start() + createStartable(enabled = false).apply { + start() + onBootCompleted() + } + + verifyZeroInteractions(controlsController, controlsListingController, userTracker) + } + + @Test + fun testNothingCalledOnStart() { + createStartable(enabled = true).start() + + fakeExecutor.advanceClockToLast() + fakeExecutor.runAllReady() verifyZeroInteractions(controlsController, controlsListingController, userTracker) } @@ -84,7 +111,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -97,7 +124,7 @@ class ControlsStartableTest : SysuiTestCase() { `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION) setUpControlsListingControls(emptyList()) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -111,7 +138,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -126,7 +153,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -140,7 +167,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[0].toPanelItem()) @@ -158,7 +185,7 @@ class ControlsStartableTest : SysuiTestCase() { ) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[0].toPanelItem()) @@ -176,21 +203,67 @@ class ControlsStartableTest : SysuiTestCase() { ) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[1].toPanelItem()) } @Test - fun testPreferredSelectionIsPanel_bindOnStart() { + fun testPreferredSelectionIsPanel_bindOnBoot() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() + fakeExecutor.runAllReady() + + verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL) + } + + @Test + fun testPreferredSelectionIsPanel_userNotUnlocked_notBind() { + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false) + + val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) + setUpControlsListingControls(listings) + `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) + + createStartable(enabled = true).onBootCompleted() + fakeExecutor.runAllReady() + + verify(controlsController, never()).bindComponentForPanel(TEST_COMPONENT_PANEL) + } + + @Test + fun testPreferredSelectionIsPanel_userNotUnlocked_broadcastRegistered_broadcastSentBinds() { + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false) + + val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) + setUpControlsListingControls(listings) + `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) + + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() + val intentFilterCaptor = argumentCaptor<IntentFilter>() + val receiverCaptor = argumentCaptor<BroadcastReceiver>() + + verify(broadcastDispatcher) + .registerReceiver( + capture(receiverCaptor), + capture(intentFilterCaptor), + eq(fakeExecutor), + nullable(), + anyInt(), + nullable() + ) + assertThat(intentFilterCaptor.value.matchAction(Intent.ACTION_USER_UNLOCKED)).isTrue() + + // User is unlocked + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true) + receiverCaptor.value.onReceive(mock(), Intent(Intent.ACTION_USER_UNLOCKED)) + verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL) } @@ -201,7 +274,7 @@ class ControlsStartableTest : SysuiTestCase() { `when`(controlsController.getPreferredSelection()) .thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL)) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).bindComponentForPanel(any()) @@ -213,7 +286,7 @@ class ControlsStartableTest : SysuiTestCase() { setUpControlsListingControls(listings) `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).bindComponentForPanel(any()) @@ -228,7 +301,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) `when`(controlsListingController.getCurrentServices()).thenReturn(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() verify(controlsController, never()).setPreferredSelection(any()) } @@ -258,6 +331,8 @@ class ControlsStartableTest : SysuiTestCase() { userTracker, authorizedPanelsRepository, preferredPanelsRepository, + userManager, + broadcastDispatcher, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt new file mode 100644 index 000000000000..0f62b24bdb06 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.controls.ui + +import android.content.Intent +import android.content.res.Configuration +import android.service.dreams.IDreamManager +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import androidx.test.filters.SmallTest +import androidx.test.rule.ActivityTestRule +import androidx.test.runner.intercepting.SingleActivityFactory +import com.android.systemui.SysuiTestCase +import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.controls.settings.ControlsSettingsDialogManager +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.statusbar.policy.KeyguardStateController +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class ControlsActivityTest : SysuiTestCase() { + @Mock private lateinit var uiController: ControlsUiController + @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock private lateinit var dreamManager: IDreamManager + @Mock private lateinit var featureFlags: FeatureFlags + @Mock private lateinit var controlsSettingsDialogManager: ControlsSettingsDialogManager + @Mock private lateinit var keyguardStateController: KeyguardStateController + + @Rule + @JvmField + var activityRule = + ActivityTestRule( + object : + SingleActivityFactory<TestableControlsActivity>( + TestableControlsActivity::class.java + ) { + override fun create(intent: Intent?): TestableControlsActivity { + return TestableControlsActivity( + uiController, + broadcastDispatcher, + dreamManager, + featureFlags, + controlsSettingsDialogManager, + keyguardStateController, + ) + } + }, + false, + false + ) + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + activityRule.launchActivity(Intent()) + } + + @Test + fun testOrientationChangeForwardsToUiController() { + val currentConfig = activityRule.activity.resources.configuration + val newConfig = Configuration(currentConfig) + newConfig.orientation = switchOrientation(currentConfig.orientation) + activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) } + + verify(uiController).onSizeChange() + } + + @Test + fun testScreenChangeForwardsToUiController() { + val currentConfig = activityRule.activity.resources.configuration + val newConfig = Configuration(currentConfig) + swapHeightWidth(newConfig) + activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) } + + verify(uiController).onSizeChange() + } + + @Test + fun testChangeSmallestScreenSizeForwardsToUiController() { + val currentConfig = activityRule.activity.resources.configuration + val newConfig = Configuration(currentConfig) + newConfig.smallestScreenWidthDp *= 2 + newConfig.screenWidthDp *= 2 + activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) } + + verify(uiController).onSizeChange() + } + + private fun switchOrientation(orientation: Int): Int { + return if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + Configuration.ORIENTATION_PORTRAIT + } else { + Configuration.ORIENTATION_LANDSCAPE + } + } + + private fun swapHeightWidth(configuration: Configuration) { + val oldHeight = configuration.screenHeightDp + val oldWidth = configuration.screenWidthDp + configuration.screenHeightDp = oldWidth + configuration.screenWidthDp = oldHeight + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsPopupMenuTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsPopupMenuTest.kt new file mode 100644 index 000000000000..86e2bd3e0890 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsPopupMenuTest.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.controls.ui + +import android.app.Activity +import android.graphics.Color +import android.graphics.drawable.ShapeDrawable +import android.testing.AndroidTestingRunner +import android.util.DisplayMetrics +import android.view.View +import android.widget.PopupWindow.OnDismissListener +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.activity.EmptyTestActivity +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify + +@SmallTest +@RunWith(AndroidTestingRunner::class) +open class ControlsPopupMenuTest : SysuiTestCase() { + + private companion object { + + const val DISPLAY_WIDTH_NARROW = 100 + const val DISPLAY_WIDTH_WIDE = 1000 + + const val MAX_WIDTH = 380 + const val HORIZONTAL_MARGIN = 16 + } + + @Rule @JvmField val activityScenarioRule = ActivityScenarioRule(EmptyTestActivity::class.java) + + private val testDisplayMetrics: DisplayMetrics = DisplayMetrics() + + @Test + fun testDismissListenerWorks() = testPopup { popupMenu -> + val listener = mock(OnDismissListener::class.java) + popupMenu.setOnDismissListener(listener) + popupMenu.show() + + popupMenu.dismissImmediate() + + verify(listener).onDismiss() + } + + @Test + fun testPopupDoesntExceedMaxWidth() = testPopup { popupMenu -> + testDisplayMetrics.widthPixels = DISPLAY_WIDTH_WIDE + + popupMenu.show() + + assertThat(popupMenu.width).isEqualTo(MAX_WIDTH) + } + + @Test + fun testPopupMarginsWidthLessMax() = testPopup { popupMenu -> + testDisplayMetrics.widthPixels = DISPLAY_WIDTH_NARROW + + popupMenu.show() + + assertThat(popupMenu.width).isEqualTo(DISPLAY_WIDTH_NARROW - 2 * HORIZONTAL_MARGIN) + } + + private fun testPopup(test: (popup: ControlsPopupMenu) -> Unit) { + activityScenarioRule.scenario.onActivity { activity -> + val testActivity = setupActivity(activity) + test(ControlsPopupMenu(testActivity).apply { anchorView = View(testActivity) }) + } + } + + private fun setupActivity(real: Activity): Activity { + val resources = + spy(real.resources).apply { + whenever(getDimensionPixelSize(R.dimen.control_popup_items_divider_height)) + .thenReturn(1) + whenever(getDimensionPixelSize(R.dimen.control_popup_horizontal_margin)) + .thenReturn(HORIZONTAL_MARGIN) + whenever(getDimensionPixelSize(R.dimen.control_popup_max_width)) + .thenReturn(MAX_WIDTH) + whenever(getDrawable(R.drawable.controls_popup_bg)).thenReturn(ShapeDrawable()) + whenever(getColor(R.color.control_popup_dim)).thenReturn(Color.WHITE) + whenever(displayMetrics).thenAnswer { testDisplayMetrics } + } + + return spy(real).also { whenever(it.resources).thenReturn(resources) } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt index 5b3e51828681..845848071f54 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt @@ -234,7 +234,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { val serviceInfo2 = setUpPanel(panel2) `when`(authorizedPanelsRepository.getAuthorizedPanels()) - .thenReturn(setOf(packageName1, packageName2)) + .thenReturn(setOf(packageName1, packageName2)) underTest.show(parent, {}, context) @@ -245,7 +245,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { captor.value.onServicesUpdated(listOf(serviceInfo1, serviceInfo2)) FakeExecutor.exhaustExecutors(uiExecutor, bgExecutor) - val header: View = parent.requireViewById(R.id.controls_header) + val header: View = parent.requireViewById(R.id.app_or_structure_spinner) assertThat(header.isClickable).isTrue() assertThat(header.hasOnClickListeners()).isTrue() } @@ -470,7 +470,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() { taskViewConsumerCaptor.value.accept(taskView) - underTest.onOrientationChange() + underTest.onSizeChange() verify(taskView).onLocationChanged() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt new file mode 100644 index 000000000000..f0b473210630 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.controls.ui + +import android.service.dreams.IDreamManager +import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.controls.settings.ControlsSettingsDialogManager +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.statusbar.policy.KeyguardStateController + +class TestableControlsActivity( + uiController: ControlsUiController, + broadcastDispatcher: BroadcastDispatcher, + dreamManager: IDreamManager, + featureFlags: FeatureFlags, + controlsSettingsDialogManager: ControlsSettingsDialogManager, + keyguardStateController: KeyguardStateController +) : + ControlsActivity( + uiController, + broadcastDispatcher, + dreamManager, + featureFlags, + controlsSettingsDialogManager, + keyguardStateController + ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java index d6dbd730368e..1a89076741ef 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java @@ -31,7 +31,6 @@ import android.animation.ValueAnimator; import android.graphics.Rect; import android.graphics.Region; import android.testing.AndroidTestingRunner; -import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; @@ -101,20 +100,16 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @Mock UiEventLogger mUiEventLogger; - final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); - private static final float TOUCH_REGION = .3f; private static final int SCREEN_WIDTH_PX = 1024; private static final int SCREEN_HEIGHT_PX = 100; + private static final Rect SCREEN_BOUNDS = new Rect(0, 0, 1024, 100); + @Before public void setup() { - mDisplayMetrics.widthPixels = SCREEN_WIDTH_PX; - mDisplayMetrics.heightPixels = SCREEN_HEIGHT_PX; - MockitoAnnotations.initMocks(this); mTouchHandler = new BouncerSwipeTouchHandler( - mDisplayMetrics, mScrimManager, Optional.of(mCentralSurfaces), mNotificationShadeWindowController, @@ -127,10 +122,10 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { when(mScrimManager.getCurrentController()).thenReturn(mScrimController); when(mCentralSurfaces.isBouncerShowing()).thenReturn(false); - when(mCentralSurfaces.getDisplayHeight()).thenReturn((float) SCREEN_HEIGHT_PX); when(mValueAnimatorCreator.create(anyFloat(), anyFloat())).thenReturn(mValueAnimator); when(mVelocityTrackerFactory.obtain()).thenReturn(mVelocityTracker); when(mFlingAnimationUtils.getMinVelocityPxPerSecond()).thenReturn(Float.MAX_VALUE); + when(mTouchSession.getBounds()).thenReturn(SCREEN_BOUNDS); } /** @@ -139,7 +134,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @Test public void testSessionStart() { final Region region = Region.obtain(); - mTouchHandler.getTouchInitiationRegion(region); + mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, region); final Rect bounds = region.getBounds(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java index 178b9cc72726..7f6e2ba1c0f9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; @@ -44,6 +45,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dreams.touch.dagger.InputSessionComponent; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.display.DisplayHelper; import com.android.systemui.util.time.FakeSystemClock; import com.google.common.util.concurrent.ListenableFuture; @@ -79,7 +81,9 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { private final DefaultLifecycleObserver mLifecycleObserver; private final InputChannelCompat.InputEventListener mEventListener; private final GestureDetector.OnGestureListener mGestureListener; + private final DisplayHelper mDisplayHelper; private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); + private final Rect mDisplayBounds = Mockito.mock(Rect.class); Environment(Set<DreamTouchHandler> handlers) { mLifecycle = Mockito.mock(Lifecycle.class); @@ -93,7 +97,11 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { .thenReturn(inputComponent); when(inputComponent.getInputSession()).thenReturn(mInputSession); - mMonitor = new DreamOverlayTouchMonitor(mExecutor, mLifecycle, mInputFactory, handlers); + mDisplayHelper = Mockito.mock(DisplayHelper.class); + when(mDisplayHelper.getMaxBounds(anyInt(), anyInt())) + .thenReturn(mDisplayBounds); + mMonitor = new DreamOverlayTouchMonitor(mExecutor, mLifecycle, mInputFactory, + mDisplayHelper, handlers); mMonitor.init(); final ArgumentCaptor<LifecycleObserver> lifecycleObserverCaptor = @@ -117,6 +125,10 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { mGestureListener = gestureListenerCaptor.getValue(); } + public Rect getDisplayBounds() { + return mDisplayBounds; + } + void executeAll() { mExecutor.runAllReady(); } @@ -140,15 +152,37 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { } @Test + public void testReportedDisplayBounds() { + final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class); + final Environment environment = new Environment(Stream.of(touchHandler) + .collect(Collectors.toCollection(HashSet::new))); + + final MotionEvent initialEvent = Mockito.mock(MotionEvent.class); + when(initialEvent.getX()).thenReturn(0.0f); + when(initialEvent.getY()).thenReturn(0.0f); + environment.publishInputEvent(initialEvent); + + // Verify display bounds passed into TouchHandler#getTouchInitiationRegion + verify(touchHandler).getTouchInitiationRegion(eq(environment.getDisplayBounds()), any()); + final ArgumentCaptor<DreamTouchHandler.TouchSession> touchSessionArgumentCaptor = + ArgumentCaptor.forClass(DreamTouchHandler.TouchSession.class); + verify(touchHandler).onSessionStart(touchSessionArgumentCaptor.capture()); + + // Verify that display bounds provided from TouchSession#getBounds + assertThat(touchSessionArgumentCaptor.getValue().getBounds()) + .isEqualTo(environment.getDisplayBounds()); + } + + @Test public void testEntryTouchZone() { final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class); final Rect touchArea = new Rect(4, 4, 8 , 8); doAnswer(invocation -> { - final Region region = (Region) invocation.getArguments()[0]; + final Region region = (Region) invocation.getArguments()[1]; region.set(touchArea); return null; - }).when(touchHandler).getTouchInitiationRegion(any()); + }).when(touchHandler).getTouchInitiationRegion(any(), any()); final Environment environment = new Environment(Stream.of(touchHandler) .collect(Collectors.toCollection(HashSet::new))); @@ -174,10 +208,10 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { final DreamTouchHandler unzonedTouchHandler = Mockito.mock(DreamTouchHandler.class); doAnswer(invocation -> { - final Region region = (Region) invocation.getArguments()[0]; + final Region region = (Region) invocation.getArguments()[1]; region.set(touchArea); return null; - }).when(touchHandler).getTouchInitiationRegion(any()); + }).when(touchHandler).getTouchInitiationRegion(any(), any()); final Environment environment = new Environment(Stream.of(touchHandler, unzonedTouchHandler) .collect(Collectors.toCollection(HashSet::new))); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt index 3d13d8092651..276b3e39180b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt @@ -20,9 +20,10 @@ package com.android.systemui.keyguard.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectValues import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository -import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.AOD +import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED @@ -30,9 +31,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING import com.android.systemui.keyguard.shared.model.TransitionState.STARTED import com.android.systemui.keyguard.shared.model.TransitionStep import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -53,138 +52,151 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { } @Test - fun `transition collectors receives only appropriate events`() = - runTest(UnconfinedTestDispatcher()) { - var lockscreenToAodSteps = mutableListOf<TransitionStep>() - val job1 = - underTest.lockscreenToAodTransition - .onEach { lockscreenToAodSteps.add(it) } - .launchIn(this) - - var aodToLockscreenSteps = mutableListOf<TransitionStep>() - val job2 = - underTest.aodToLockscreenTransition - .onEach { aodToLockscreenSteps.add(it) } - .launchIn(this) - - val steps = mutableListOf<TransitionStep>() - steps.add(TransitionStep(AOD, GONE, 0f, STARTED)) - steps.add(TransitionStep(AOD, GONE, 1f, FINISHED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.1f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.2f, RUNNING)) - - steps.forEach { repository.sendTransitionStep(it) } - - assertThat(aodToLockscreenSteps).isEqualTo(steps.subList(2, 5)) - assertThat(lockscreenToAodSteps).isEqualTo(steps.subList(5, 8)) - - job1.cancel() - job2.cancel() + fun `transition collectors receives only appropriate events`() = runTest { + val lockscreenToAodSteps by collectValues(underTest.lockscreenToAodTransition) + val aodToLockscreenSteps by collectValues(underTest.aodToLockscreenTransition) + + val steps = mutableListOf<TransitionStep>() + steps.add(TransitionStep(AOD, GONE, 0f, STARTED)) + steps.add(TransitionStep(AOD, GONE, 1f, FINISHED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.1f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.2f, RUNNING)) + + steps.forEach { + repository.sendTransitionStep(it) + runCurrent() } - @Test - fun dozeAmountTransitionTest() = - runTest(UnconfinedTestDispatcher()) { - var dozeAmountSteps = mutableListOf<TransitionStep>() - val job = underTest.dozeAmountTransition.onEach { dozeAmountSteps.add(it) }.launchIn(this) - - val steps = mutableListOf<TransitionStep>() - - steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.8f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) - - steps.forEach { repository.sendTransitionStep(it) } - - assertThat(dozeAmountSteps.subList(0, 3)) - .isEqualTo( - listOf( - steps[0].copy(value = 1f - steps[0].value), - steps[1].copy(value = 1f - steps[1].value), - steps[2].copy(value = 1f - steps[2].value), - ) - ) - assertThat(dozeAmountSteps.subList(3, 7)).isEqualTo(steps.subList(3, 7)) - - job.cancel() - } + assertThat(aodToLockscreenSteps).isEqualTo(steps.subList(2, 5)) + assertThat(lockscreenToAodSteps).isEqualTo(steps.subList(5, 8)) + } @Test - fun keyguardStateTests() = - runTest(UnconfinedTestDispatcher()) { - var finishedSteps = mutableListOf<KeyguardState>() - val job = underTest.finishedKeyguardState.onEach { finishedSteps.add(it) }.launchIn(this) - - val steps = mutableListOf<TransitionStep>() - - steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) - steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) - - steps.forEach { repository.sendTransitionStep(it) } - - assertThat(finishedSteps).isEqualTo(listOf(LOCKSCREEN, AOD)) - - job.cancel() + fun dozeAmountTransitionTest() = runTest { + val dozeAmountSteps by collectValues(underTest.dozeAmountTransition) + + val steps = mutableListOf<TransitionStep>() + + steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.8f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) + + steps.forEach { + repository.sendTransitionStep(it) + runCurrent() } - @Test - fun finishedKeyguardTransitionStepTests() = - runTest(UnconfinedTestDispatcher()) { - var finishedSteps = mutableListOf<TransitionStep>() - val job = - underTest.finishedKeyguardTransitionStep.onEach { finishedSteps.add(it) }.launchIn(this) - - val steps = mutableListOf<TransitionStep>() - - steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) - steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) - - steps.forEach { repository.sendTransitionStep(it) } - - assertThat(finishedSteps).isEqualTo(listOf(steps[2], steps[5])) + assertThat(dozeAmountSteps.subList(0, 3)) + .isEqualTo( + listOf( + steps[0].copy(value = 1f - steps[0].value), + steps[1].copy(value = 1f - steps[1].value), + steps[2].copy(value = 1f - steps[2].value), + ) + ) + assertThat(dozeAmountSteps.subList(3, 7)).isEqualTo(steps.subList(3, 7)) + } - job.cancel() + @Test + fun keyguardStateTests() = runTest { + val finishedSteps by collectValues(underTest.finishedKeyguardState) + + val steps = mutableListOf<TransitionStep>() + + steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) + steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) + + steps.forEach { + repository.sendTransitionStep(it) + runCurrent() } + assertThat(finishedSteps).isEqualTo(listOf(LOCKSCREEN, AOD)) + } + @Test - fun startedKeyguardTransitionStepTests() = - runTest(UnconfinedTestDispatcher()) { - var startedSteps = mutableListOf<TransitionStep>() - val job = - underTest.startedKeyguardTransitionStep.onEach { startedSteps.add(it) }.launchIn(this) + fun finishedKeyguardTransitionStepTests() = runTest { + val finishedSteps by collectValues(underTest.finishedKeyguardTransitionStep) + + val steps = mutableListOf<TransitionStep>() + + steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) + steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) + + steps.forEach { + repository.sendTransitionStep(it) + runCurrent() + } - val steps = mutableListOf<TransitionStep>() + assertThat(finishedSteps).isEqualTo(listOf(steps[2], steps[5])) + } - steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) - steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) - steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) - steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) + @Test + fun startedKeyguardTransitionStepTests() = runTest { + val startedSteps by collectValues(underTest.startedKeyguardTransitionStep) + + val steps = mutableListOf<TransitionStep>() + + steps.add(TransitionStep(AOD, LOCKSCREEN, 0f, STARTED)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 0.5f, RUNNING)) + steps.add(TransitionStep(AOD, LOCKSCREEN, 1f, FINISHED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0f, STARTED)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 0.9f, RUNNING)) + steps.add(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED)) + steps.add(TransitionStep(AOD, GONE, 1f, STARTED)) + + steps.forEach { + repository.sendTransitionStep(it) + runCurrent() + } - steps.forEach { repository.sendTransitionStep(it) } + assertThat(startedSteps).isEqualTo(listOf(steps[0], steps[3], steps[6])) + } - assertThat(startedSteps).isEqualTo(listOf(steps[0], steps[3], steps[6])) + @Test + fun transitionValue() = runTest { + val startedSteps by collectValues(underTest.transitionValue(state = DOZING)) + + val toSteps = + listOf( + TransitionStep(AOD, DOZING, 0f, STARTED), + TransitionStep(AOD, DOZING, 0.5f, RUNNING), + TransitionStep(AOD, DOZING, 1f, FINISHED), + ) + toSteps.forEach { + repository.sendTransitionStep(it) + runCurrent() + } - job.cancel() + val fromSteps = + listOf( + TransitionStep(DOZING, LOCKSCREEN, 0f, STARTED), + TransitionStep(DOZING, LOCKSCREEN, 0.5f, RUNNING), + TransitionStep(DOZING, LOCKSCREEN, 1f, FINISHED), + ) + fromSteps.forEach { + repository.sendTransitionStep(it) + runCurrent() } + + assertThat(startedSteps).isEqualTo(listOf(0f, 0.5f, 1f, 1f, 0.5f, 0f)) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt index 2ab1b99b7fee..9cd2220f56de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt @@ -125,4 +125,26 @@ class KeyguardBouncerViewModelTest : SysuiTestCase() { assertThat(sideFpsIsShowing).isEqualTo(true) job.cancel() } + + @Test + fun isShowing() = runTest { + var isShowing: Boolean? = null + val job = underTest.isShowing.onEach { isShowing = it }.launchIn(this) + repository.setPrimaryShow(true) + // Run the tasks that are pending at this point of virtual time. + runCurrent() + assertThat(isShowing).isEqualTo(true) + job.cancel() + } + + @Test + fun isNotShowing() = runTest { + var isShowing: Boolean? = null + val job = underTest.isShowing.onEach { isShowing = it }.launchIn(this) + repository.setPrimaryShow(false) + // Run the tasks that are pending at this point of virtual time. + runCurrent() + assertThat(isShowing).isEqualTo(false) + job.cancel() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt index e0ca90ec2c58..a72634bcb807 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt @@ -17,7 +17,7 @@ package com.android.systemui.media.controls.ui import android.app.PendingIntent -import android.content.res.ColorStateList +import android.content.res.Configuration import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.util.MathUtils.abs @@ -26,9 +26,9 @@ import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback -import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor @@ -49,7 +49,7 @@ import com.android.systemui.qs.PageIndicator import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider import com.android.systemui.statusbar.policy.ConfigurationController -import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock @@ -89,6 +89,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager @Mock lateinit var mediaHostState: MediaHostState @Mock lateinit var activityStarter: ActivityStarter + @Mock @Main private lateinit var executor: DelayableExecutor @Mock lateinit var mediaDataManager: MediaDataManager @Mock lateinit var configurationController: ConfigurationController @Mock lateinit var falsingCollector: FalsingCollector @@ -112,15 +113,11 @@ class MediaCarouselControllerTest : SysuiTestCase() { private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController - private lateinit var mainExecutor: FakeExecutor - private lateinit var backgroundExecutor: FakeExecutor @Before fun setup() { MockitoAnnotations.initMocks(this) transitionRepository = FakeKeyguardTransitionRepository() - mainExecutor = FakeExecutor(clock) - backgroundExecutor = FakeExecutor(clock) mediaCarouselController = MediaCarouselController( context, @@ -129,8 +126,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { mediaHostStatesManager, activityStarter, clock, - mainExecutor, - backgroundExecutor, + executor, mediaDataManager, configurationController, falsingCollector, @@ -405,7 +401,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = true ) ) - runAllReady() assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), @@ -515,8 +510,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { false ) mediaCarouselController.shouldScrollToKey = true - runAllReady() - // switching between media players. listener.value.onMediaDataLoaded( "playing local", @@ -538,7 +531,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) - runAllReady() assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), @@ -563,7 +555,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) - runAllReady() var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") assertEquals( @@ -586,8 +577,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { packageName = "PACKAGE_NAME" ) ) - runAllReady() - playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") assertEquals(playerIndex, 0) } @@ -684,38 +673,17 @@ class MediaCarouselControllerTest : SysuiTestCase() { } @Test - fun testOnUiModeChanged_playersAreAddedBack() { - mediaCarouselController.pageIndicator = pageIndicator - + fun testOnConfigChanged_playersAreAddedBack() { listener.value.onMediaDataLoaded( - "paused local", + "playing local", null, DATA.copy( active = true, - isPlaying = false, + isPlaying = true, playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false ) ) - runAllReady() - - val playersSize = MediaPlayerData.players().size - configListener.value.onUiModeChanged() - runAllReady() - - verify(pageIndicator).tintList = - ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) - assertEquals(playersSize, MediaPlayerData.players().size) - assertEquals( - MediaPlayerData.getMediaPlayerIndex("paused local"), - mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex - ) - } - - @Test - fun testOnDensityOrFontScaleChanged_playersAreAddedBack() { - mediaCarouselController.pageIndicator = pageIndicator - listener.value.onMediaDataLoaded( "paused local", null, @@ -726,46 +694,14 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) - runAllReady() val playersSize = MediaPlayerData.players().size - configListener.value.onDensityOrFontScaleChanged() - runAllReady() - - verify(pageIndicator).tintList = - ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) - assertEquals(playersSize, MediaPlayerData.players().size) - assertEquals( - MediaPlayerData.getMediaPlayerIndex("paused local"), - mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex - ) - } - @Test - fun testOnThemeChanged_playersAreAddedBack() { - mediaCarouselController.pageIndicator = pageIndicator + configListener.value.onConfigChanged(Configuration()) - listener.value.onMediaDataLoaded( - "paused local", - null, - DATA.copy( - active = true, - isPlaying = false, - playbackLocation = MediaData.PLAYBACK_LOCAL, - resumption = false - ) - ) - runAllReady() - - val playersSize = MediaPlayerData.players().size - configListener.value.onThemeChanged() - runAllReady() - - verify(pageIndicator).tintList = - ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) assertEquals(playersSize, MediaPlayerData.players().size) assertEquals( - MediaPlayerData.getMediaPlayerIndex("paused local"), + MediaPlayerData.getMediaPlayerIndex("playing local"), mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex ) } @@ -896,9 +832,4 @@ class MediaCarouselControllerTest : SysuiTestCase() { // Verify that seekbar listening attribute in media control panel is set to false. verify(panel, times(MediaPlayerData.players().size)).listening = false } - - private fun runAllReady() { - backgroundExecutor.runAllReady() - mainExecutor.runAllReady() - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt index feb429d2f0d4..eb78ded008b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt @@ -389,6 +389,15 @@ class MediaHierarchyManagerTest : SysuiTestCase() { } @Test + fun getGuidedTransformationTranslationY_previousHostInvisible_returnsZero() { + goToLockscreen() + enterGuidedTransformation() + whenever(lockHost.visible).thenReturn(false) + + assertThat(mediaHierarchyManager.getGuidedTransformationTranslationY()).isEqualTo(0) + } + + @Test fun isCurrentlyInGuidedTransformation_hostsVisible_returnsTrue() { goToLockscreen() enterGuidedTransformation() diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java index 9ecc63ca9232..c3fabfefef58 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java @@ -306,7 +306,8 @@ public class MediaOutputDialogTest extends SysuiTestCase { @Test public void getStopButtonText_notSupportsBroadcast_returnsDefaultText() { - String stopText = mContext.getText(R.string.keyboard_key_media_stop).toString(); + String stopText = mContext.getText( + R.string.media_output_dialog_button_stop_casting).toString(); MediaOutputController mockMediaOutputController = mock(MediaOutputController.class); when(mockMediaOutputController.isBroadcastSupported()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java index d364f47d78b5..fb5197eff73f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java @@ -20,6 +20,7 @@ import static com.android.systemui.monet.utils.ArgbSubject.assertThat; import static org.junit.Assert.assertTrue; + import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; @@ -178,12 +179,39 @@ public final class DynamicColorTest extends SysuiTestCase { } } + @Test + public void valuesAreCorrect() { + // Checks that the values of certain dynamic colors match Dart results. + assertThat( + MaterialDynamicColors.onPrimaryContainer.getArgb( + new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5))) + .isSameColorAs(0xFFFFE5E1); + assertThat( + MaterialDynamicColors.onSecondaryContainer.getArgb( + new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5))) + .isSameColorAs(0xFFFFFCFF); + assertThat( + MaterialDynamicColors.onTertiaryContainer.getArgb( + new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5))) + .isSameColorAs(0xFF616600); + assertThat( + MaterialDynamicColors.surfaceInverse.getArgb( + new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0))) + .isSameColorAs(0xFF464652); + assertThat( + MaterialDynamicColors.primaryInverse.getArgb( + new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5))) + .isSameColorAs(0xFFFF8C7A); + assertThat( + MaterialDynamicColors.outlineVariant.getArgb( + new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0))) + .isSameColorAs(0xFF484831); + } + private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) { double fgTone = fg.getHct(scheme).getTone(); double bgTone = bg.getHct(scheme).getTone(); - // TODO(b/270915664) - Fix inconsistencies. - // TODO(b/270915664) - Minimum requirement should be 4.5 when not reducing contrast. - double minimumRequirement = 3.0; + double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0; return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt index f807146cdf12..c6db565d7954 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt @@ -20,7 +20,14 @@ import android.view.MotionEvent import android.view.ViewConfiguration import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionState +import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.multishade.data.remoteproxy.MultiShadeInputProxy import com.android.systemui.multishade.data.repository.MultiShadeRepository import com.android.systemui.multishade.shared.model.ProxiedInputModel @@ -36,12 +43,18 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(JUnit4::class) class MultiShadeMotionEventInteractorTest : SysuiTestCase() { + @Mock private lateinit var bouncerInteractor: PrimaryBouncerInteractor + private lateinit var underTest: MultiShadeMotionEventInteractor private lateinit var testScope: TestScope @@ -49,9 +62,13 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { private lateinit var repository: MultiShadeRepository private lateinit var interactor: MultiShadeInteractor private val touchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop + private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository + private lateinit var falsingManager: FalsingManagerFake @Before fun setUp() { + MockitoAnnotations.initMocks(this) + testScope = TestScope() motionEvents = mutableSetOf() @@ -67,11 +84,19 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { repository = repository, inputProxy = inputProxy, ) + keyguardTransitionRepository = FakeKeyguardTransitionRepository() + falsingManager = FalsingManagerFake() underTest = MultiShadeMotionEventInteractor( applicationContext = context, applicationScope = testScope.backgroundScope, - interactor = interactor, + multiShadeInteractor = interactor, + keyguardTransitionInteractor = + KeyguardTransitionInteractor( + repository = keyguardTransitionRepository, + ), + bouncerInteractor = bouncerInteractor, + falsingManager = falsingManager, ) } @@ -202,6 +227,60 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { } @Test + fun shouldIntercept_moveAboveTouchSlopAndUp_butBouncerShowing_returnsFalse() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.PRIMARY_BOUNCER, + value = 0.1f, + transitionState = TransitionState.STARTED, + ) + ) + runCurrent() + + underTest.shouldIntercept(motionEvent(MotionEvent.ACTION_DOWN)) + + assertThat( + underTest.shouldIntercept( + motionEvent( + MotionEvent.ACTION_MOVE, + y = touchSlop + 1f, + ) + ) + ) + .isFalse() + assertThat(underTest.shouldIntercept(motionEvent(MotionEvent.ACTION_UP))).isFalse() + } + + @Test + fun shouldIntercept_moveAboveTouchSlopAndCancel_butBouncerShowing_returnsFalse() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.PRIMARY_BOUNCER, + value = 0.1f, + transitionState = TransitionState.STARTED, + ) + ) + runCurrent() + + underTest.shouldIntercept(motionEvent(MotionEvent.ACTION_DOWN)) + + assertThat( + underTest.shouldIntercept( + motionEvent( + MotionEvent.ACTION_MOVE, + y = touchSlop + 1f, + ) + ) + ) + .isFalse() + assertThat(underTest.shouldIntercept(motionEvent(MotionEvent.ACTION_CANCEL))).isFalse() + } + + @Test fun tap_doesNotSendProxiedInput() = testScope.runTest { val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT)) @@ -233,7 +312,7 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { } @Test - fun dragAboveTouchSlopAndUp() = + fun dragShadeAboveTouchSlopAndUp() = testScope.runTest { val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT)) val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT)) @@ -277,7 +356,7 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { } @Test - fun dragAboveTouchSlopAndCancel() = + fun dragShadeAboveTouchSlopAndCancel() = testScope.runTest { val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT)) val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT)) @@ -320,6 +399,87 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() { assertThat(singleShadeProxiedInput).isNull() } + @Test + fun dragBouncerAboveTouchSlopAndUp_showsBouncer() = + testScope.runTest { + val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT)) + val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT)) + val singleShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.SINGLE)) + + underTest.shouldIntercept( + motionEvent( + MotionEvent.ACTION_DOWN, + x = 100f, // left shade + ) + ) + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + + val yDragAmountPx = -(touchSlop + 1f) // dragging up + val moveEvent = + motionEvent( + MotionEvent.ACTION_MOVE, + x = 100f, // left shade + y = yDragAmountPx, + ) + assertThat(underTest.shouldIntercept(moveEvent)).isTrue() + underTest.onTouchEvent(moveEvent, viewWidthPx = 1000) + verify(bouncerInteractor).show(isScrimmed = true) + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + + val upEvent = motionEvent(MotionEvent.ACTION_UP) + assertThat(underTest.shouldIntercept(upEvent)).isTrue() + underTest.onTouchEvent(upEvent, viewWidthPx = 1000) + verify(bouncerInteractor, never()).hide() + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + } + + @Test + fun dragBouncerAboveTouchSlopAndCancel_falseTouch_showsThenHidesBouncer() = + testScope.runTest { + val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT)) + val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT)) + val singleShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.SINGLE)) + + underTest.shouldIntercept( + motionEvent( + MotionEvent.ACTION_DOWN, + x = 900f, // right shade + ) + ) + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + + val yDragAmountPx = -(touchSlop + 1f) // drag up + val moveEvent = + motionEvent( + MotionEvent.ACTION_MOVE, + x = 900f, // right shade + y = yDragAmountPx, + ) + assertThat(underTest.shouldIntercept(moveEvent)).isTrue() + underTest.onTouchEvent(moveEvent, viewWidthPx = 1000) + verify(bouncerInteractor).show(isScrimmed = true) + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + + falsingManager.setIsFalseTouch(true) + val cancelEvent = motionEvent(MotionEvent.ACTION_CANCEL) + assertThat(underTest.shouldIntercept(cancelEvent)).isTrue() + underTest.onTouchEvent(cancelEvent, viewWidthPx = 1000) + verify(bouncerInteractor).hide() + assertThat(leftShadeProxiedInput).isNull() + assertThat(rightShadeProxiedInput).isNull() + assertThat(singleShadeProxiedInput).isNull() + } + private fun TestScope.motionEvent( action: Int, downTime: Long = currentTime, diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt index e64094675ff5..6543bcb33327 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.notetask +import android.app.ActivityManager import android.app.KeyguardManager import android.app.admin.DevicePolicyManager import android.app.role.RoleManager @@ -69,26 +70,27 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidJUnit4::class) internal class NoteTaskControllerTest : SysuiTestCase() { - @Mock lateinit var context: Context - @Mock lateinit var packageManager: PackageManager - @Mock lateinit var resolver: NoteTaskInfoResolver - @Mock lateinit var bubbles: Bubbles - @Mock lateinit var keyguardManager: KeyguardManager - @Mock lateinit var userManager: UserManager - @Mock lateinit var eventLogger: NoteTaskEventLogger - @Mock lateinit var roleManager: RoleManager - @Mock lateinit var shortcutManager: ShortcutManager + @Mock private lateinit var context: Context + @Mock private lateinit var packageManager: PackageManager + @Mock private lateinit var resolver: NoteTaskInfoResolver + @Mock private lateinit var bubbles: Bubbles + @Mock private lateinit var keyguardManager: KeyguardManager + @Mock private lateinit var userManager: UserManager + @Mock private lateinit var eventLogger: NoteTaskEventLogger + @Mock private lateinit var roleManager: RoleManager + @Mock private lateinit var shortcutManager: ShortcutManager + @Mock private lateinit var activityManager: ActivityManager @Mock private lateinit var devicePolicyManager: DevicePolicyManager private val userTracker: UserTracker = FakeUserTracker() - private val noteTaskInfo = NoteTaskInfo(packageName = NOTES_PACKAGE_NAME, uid = NOTES_UID) @Before fun setUp() { MockitoAnnotations.initMocks(this) - whenever(context.getString(R.string.note_task_button_label)).thenReturn(NOTES_SHORT_LABEL) + whenever(context.getString(R.string.note_task_button_label)) + .thenReturn(NOTE_TASK_SHORT_LABEL) whenever(context.packageManager).thenReturn(packageManager) - whenever(resolver.resolveInfo(any(), any())).thenReturn(noteTaskInfo) + whenever(resolver.resolveInfo(any(), any())).thenReturn(NOTE_TASK_INFO) whenever(userManager.isUserUnlocked).thenReturn(true) whenever( devicePolicyManager.getKeyguardDisabledFeatures( @@ -98,7 +100,8 @@ internal class NoteTaskControllerTest : SysuiTestCase() { ) .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE) whenever(roleManager.getRoleHoldersAsUser(ROLE_NOTES, userTracker.userHandle)) - .thenReturn(listOf(NOTES_PACKAGE_NAME)) + .thenReturn(listOf(NOTE_TASK_PACKAGE_NAME)) + whenever(activityManager.getRunningTasks(anyInt())).thenReturn(emptyList()) } private fun createNoteTaskController( @@ -117,12 +120,13 @@ internal class NoteTaskControllerTest : SysuiTestCase() { userTracker = userTracker, roleManager = roleManager, shortcutManager = shortcutManager, + activityManager = activityManager, ) // region onBubbleExpandChanged @Test fun onBubbleExpandChanged_expanding_logNoteTaskOpened() { - val expectedInfo = noteTaskInfo.copy(isKeyguardLocked = false) + val expectedInfo = NOTE_TASK_INFO.copy(isKeyguardLocked = false) createNoteTaskController() .apply { infoReference.set(expectedInfo) } @@ -137,7 +141,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { @Test fun onBubbleExpandChanged_collapsing_logNoteTaskClosed() { - val expectedInfo = noteTaskInfo.copy(isKeyguardLocked = false) + val expectedInfo = NOTE_TASK_INFO.copy(isKeyguardLocked = false) createNoteTaskController() .apply { infoReference.set(expectedInfo) } @@ -152,7 +156,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { @Test fun onBubbleExpandChanged_expandingAndKeyguardLocked_shouldDoNothing() { - val expectedInfo = noteTaskInfo.copy(isKeyguardLocked = true) + val expectedInfo = NOTE_TASK_INFO.copy(isKeyguardLocked = true) createNoteTaskController() .apply { infoReference.set(expectedInfo) } @@ -166,7 +170,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { @Test fun onBubbleExpandChanged_notExpandingAndKeyguardLocked_shouldDoNothing() { - val expectedInfo = noteTaskInfo.copy(isKeyguardLocked = true) + val expectedInfo = NOTE_TASK_INFO.copy(isKeyguardLocked = true) createNoteTaskController() .apply { infoReference.set(expectedInfo) } @@ -205,7 +209,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { @Test fun showNoteTask_keyguardIsLocked_shouldStartActivityAndLogUiEvent() { val expectedInfo = - noteTaskInfo.copy( + NOTE_TASK_INFO.copy( entryPoint = NoteTaskEntryPoint.TAIL_BUTTON, isKeyguardLocked = true, ) @@ -222,7 +226,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { verify(context).startActivityAsUser(capture(intentCaptor), capture(userCaptor)) intentCaptor.value.let { intent -> assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME) assertThat(intent.flags and FLAG_ACTIVITY_NEW_TASK).isEqualTo(FLAG_ACTIVITY_NEW_TASK) assertThat(intent.flags and FLAG_ACTIVITY_MULTIPLE_TASK) .isEqualTo(FLAG_ACTIVITY_MULTIPLE_TASK) @@ -239,7 +243,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { fun showNoteTaskWithUser_keyguardIsLocked_shouldStartActivityWithExpectedUserAndLogUiEvent() { val user10 = UserHandle.of(/* userId= */ 10) val expectedInfo = - noteTaskInfo.copy( + NOTE_TASK_INFO.copy( entryPoint = NoteTaskEntryPoint.TAIL_BUTTON, isKeyguardLocked = true, ) @@ -257,7 +261,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { verify(context).startActivityAsUser(capture(intentCaptor), capture(userCaptor)) intentCaptor.value.let { intent -> assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME) assertThat(intent.flags and FLAG_ACTIVITY_NEW_TASK).isEqualTo(FLAG_ACTIVITY_NEW_TASK) assertThat(intent.flags and FLAG_ACTIVITY_MULTIPLE_TASK) .isEqualTo(FLAG_ACTIVITY_MULTIPLE_TASK) @@ -271,9 +275,27 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } @Test + fun showNoteTask_keyguardIsLocked_noteIsOpen_shouldStartActivityAndLogUiEvent() { + val expectedInfo = + NOTE_TASK_INFO.copy( + entryPoint = NoteTaskEntryPoint.TAIL_BUTTON, + isKeyguardLocked = true, + ) + whenever(keyguardManager.isKeyguardLocked).thenReturn(expectedInfo.isKeyguardLocked) + whenever(resolver.resolveInfo(any(), any())).thenReturn(expectedInfo) + whenever(activityManager.getRunningTasks(anyInt())) + .thenReturn(listOf(NOTE_RUNNING_TASK_INFO)) + + createNoteTaskController().showNoteTask(entryPoint = expectedInfo.entryPoint!!) + + verify(context, never()).startActivityAsUser(any(), any()) + verifyZeroInteractions(bubbles, eventLogger) + } + + @Test fun showNoteTask_keyguardIsUnlocked_shouldStartBubblesWithoutLoggingUiEvent() { val expectedInfo = - noteTaskInfo.copy( + NOTE_TASK_INFO.copy( entryPoint = NoteTaskEntryPoint.TAIL_BUTTON, isKeyguardLocked = false, ) @@ -291,7 +313,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { .showOrHideAppBubble(capture(intentCaptor), eq(userTracker.userHandle), isNull()) intentCaptor.value.let { intent -> assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME) assertThat(intent.flags).isEqualTo(FLAG_ACTIVITY_NEW_TASK) assertThat(intent.getBooleanExtra(Intent.EXTRA_USE_STYLUS_MODE, false)).isTrue() } @@ -426,7 +448,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { .showOrHideAppBubble(capture(intentCaptor), eq(userTracker.userHandle), isNull()) intentCaptor.value.let { intent -> assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME) assertThat(intent.flags).isEqualTo(FLAG_ACTIVITY_NEW_TASK) assertThat(intent.getBooleanExtra(Intent.EXTRA_USE_STYLUS_MODE, false)).isTrue() } @@ -450,7 +472,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { .showOrHideAppBubble(capture(intentCaptor), eq(userTracker.userHandle), isNull()) intentCaptor.value.let { intent -> assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME) assertThat(intent.flags).isEqualTo(FLAG_ACTIVITY_NEW_TASK) assertThat(intent.getBooleanExtra(Intent.EXTRA_USE_STYLUS_MODE, false)).isTrue() } @@ -480,11 +502,11 @@ internal class NoteTaskControllerTest : SysuiTestCase() { assertThat(actualShortcut.intent?.component?.className) .isEqualTo(LaunchNoteTaskActivity::class.java.name) assertThat(actualShortcut.intent?.action).isEqualTo(Intent.ACTION_CREATE_NOTE) - assertThat(actualShortcut.shortLabel).isEqualTo(NOTES_SHORT_LABEL) + assertThat(actualShortcut.shortLabel).isEqualTo(NOTE_TASK_SHORT_LABEL) assertThat(actualShortcut.isLongLived).isEqualTo(true) assertThat(actualShortcut.icon.resId).isEqualTo(R.drawable.ic_note_task_shortcut_widget) assertThat(actualShortcut.extras?.getString(EXTRA_SHORTCUT_BADGE_OVERRIDE_PACKAGE)) - .isEqualTo(NOTES_PACKAGE_NAME) + .isEqualTo(NOTE_TASK_PACKAGE_NAME) } @Test @@ -528,8 +550,19 @@ internal class NoteTaskControllerTest : SysuiTestCase() { // endregion private companion object { - const val NOTES_SHORT_LABEL = "Notetaking" - const val NOTES_PACKAGE_NAME = "com.android.note.app" - const val NOTES_UID = 123456 + const val NOTE_TASK_SHORT_LABEL = "Notetaking" + const val NOTE_TASK_ACTIVITY_NAME = "NoteTaskActivity" + const val NOTE_TASK_PACKAGE_NAME = "com.android.note.app" + const val NOTE_TASK_UID = 123456 + + private val NOTE_TASK_INFO = + NoteTaskInfo( + packageName = NOTE_TASK_PACKAGE_NAME, + uid = NOTE_TASK_UID, + ) + private val NOTE_RUNNING_TASK_INFO = + ActivityManager.RunningTaskInfo().apply { + topActivity = ComponentName(NOTE_TASK_PACKAGE_NAME, NOTE_TASK_ACTIVITY_NAME) + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfigTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfigTest.kt index d44012f31fa5..42ef2b5ad3ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfigTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfigTest.kt @@ -19,6 +19,7 @@ package com.android.systemui.notetask.quickaffordance import android.hardware.input.InputSettings +import android.os.UserManager import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import com.android.dx.mockito.inline.extended.ExtendedMockito @@ -33,6 +34,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepo import com.android.systemui.notetask.NoteTaskController import com.android.systemui.notetask.NoteTaskEntryPoint import com.android.systemui.stylus.StylusManager +import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -55,6 +57,7 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { @Mock lateinit var controller: NoteTaskController @Mock lateinit var stylusManager: StylusManager @Mock lateinit var repository: KeyguardQuickAffordanceRepository + @Mock lateinit var userManager: UserManager private lateinit var mockitoSession: MockitoSession @@ -66,12 +69,6 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { .mockStatic(InputSettings::class.java) .strictness(Strictness.LENIENT) .startMocking() - - whenever(InputSettings.isStylusEverUsed(mContext)).then { true } - whenever(repository.selections).then { - val map = mapOf("" to listOf(createUnderTest())) - MutableStateFlow(map) - } } @After @@ -84,6 +81,8 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { context = context, controller = controller, stylusManager = stylusManager, + userManager = userManager, + keyguardMonitor = mock(), lazyRepository = { repository }, isEnabled = isEnabled, ) @@ -98,47 +97,101 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { ) ) + // region lockScreenState @Test - fun lockScreenState_stylusUsed_noCustomShortcutSelected_shouldEmitVisible() = runTest { - val underTest = createUnderTest() + fun lockScreenState_stylusUsed_userUnlocked_isSelected_shouldEmitVisible() = runTest { + TestConfig() + .setStylusEverUsed(true) + .setUserUnlocked(true) + .setConfigSelections(mock<NoteTaskQuickAffordanceConfig>()) + val underTest = createUnderTest() val actual by collectLastValue(underTest.lockScreenState) assertThat(actual).isEqualTo(createLockScreenStateVisible()) } @Test - fun lockScreenState_noStylusEverUsed_noCustomShortcutSelected_shouldEmitVisible() = runTest { - whenever(InputSettings.isStylusEverUsed(mContext)).then { false } + fun lockScreenState_stylusUnused_userUnlocked_isSelected_shouldEmitHidden() = runTest { + TestConfig() + .setStylusEverUsed(false) + .setUserUnlocked(true) + .setConfigSelections(mock<NoteTaskQuickAffordanceConfig>()) + + val underTest = createUnderTest() + val actual by collectLastValue(underTest.lockScreenState) + + assertThat(actual).isEqualTo(LockScreenState.Hidden) + } + + @Test + fun lockScreenState_stylusUsed_userLocked_isSelected_shouldEmitHidden() = runTest { + TestConfig() + .setStylusEverUsed(true) + .setUserUnlocked(false) + .setConfigSelections(mock<NoteTaskQuickAffordanceConfig>()) + val underTest = createUnderTest() + val actual by collectLastValue(underTest.lockScreenState) + assertThat(actual).isEqualTo(LockScreenState.Hidden) + } + + @Test + fun lockScreenState_stylusUsed_userUnlocked_noSelected_shouldEmitVisible() = runTest { + TestConfig().setStylusEverUsed(true).setUserUnlocked(true).setConfigSelections() + + val underTest = createUnderTest() val actual by collectLastValue(underTest.lockScreenState) assertThat(actual).isEqualTo(createLockScreenStateVisible()) } @Test - fun lockScreenState_stylusUsed_customShortcutSelected_shouldEmitVisible() = runTest { - whenever(repository.selections).then { - val map = mapOf<String, List<KeyguardQuickAffordanceConfig>>() - MutableStateFlow(map) - } + fun lockScreenState_stylusUnused_userUnlocked_noSelected_shouldEmitHidden() = runTest { + TestConfig().setStylusEverUsed(false).setUserUnlocked(true).setConfigSelections() + + val underTest = createUnderTest() + val actual by collectLastValue(underTest.lockScreenState) + + assertThat(actual).isEqualTo(LockScreenState.Hidden) + } + + @Test + fun lockScreenState_stylusUsed_userLocked_noSelected_shouldEmitHidden() = runTest { + TestConfig().setStylusEverUsed(true).setUserUnlocked(false).setConfigSelections() + val underTest = createUnderTest() + val actual by collectLastValue(underTest.lockScreenState) + + assertThat(actual).isEqualTo(LockScreenState.Hidden) + } + + @Test + fun lockScreenState_stylusUsed_userUnlocked_customSelections_shouldEmitVisible() = runTest { + TestConfig().setStylusEverUsed(true).setUserUnlocked(true).setConfigSelections(mock()) + val underTest = createUnderTest() val actual by collectLastValue(underTest.lockScreenState) assertThat(actual).isEqualTo(createLockScreenStateVisible()) } @Test - fun lockScreenState_noIsStylusEverUsed_noCustomShortcutSelected_shouldEmitHidden() = runTest { - whenever(InputSettings.isStylusEverUsed(mContext)).then { false } - whenever(repository.selections).then { - val map = mapOf<String, List<KeyguardQuickAffordanceConfig>>() - MutableStateFlow(map) - } + fun lockScreenState_stylusUnused_userUnlocked_customSelections_shouldEmitHidden() = runTest { + TestConfig().setStylusEverUsed(false).setUserUnlocked(true).setConfigSelections(mock()) + val underTest = createUnderTest() + val actual by collectLastValue(underTest.lockScreenState) + + assertThat(actual).isEqualTo(LockScreenState.Hidden) + } + + @Test + fun lockScreenState_stylusUsed_userLocked_customSelections_shouldEmitHidden() = runTest { + TestConfig().setStylusEverUsed(true).setUserUnlocked(false).setConfigSelections(mock()) + val underTest = createUnderTest() val actual by collectLastValue(underTest.lockScreenState) assertThat(actual).isEqualTo(LockScreenState.Hidden) @@ -146,12 +199,14 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { @Test fun lockScreenState_isNotEnabled_shouldEmitHidden() = runTest { - val underTest = createUnderTest(isEnabled = false) + TestConfig().setStylusEverUsed(true).setUserUnlocked(true).setConfigSelections() + val underTest = createUnderTest(isEnabled = false) val actual by collectLastValue(underTest.lockScreenState) assertThat(actual).isEqualTo(LockScreenState.Hidden) } + // endregion @Test fun onTriggered_shouldLaunchNoteTask() { @@ -161,4 +216,22 @@ internal class NoteTaskQuickAffordanceConfigTest : SysuiTestCase() { verify(controller).showNoteTask(entryPoint = NoteTaskEntryPoint.QUICK_AFFORDANCE) } + + private inner class TestConfig { + + fun setStylusEverUsed(value: Boolean) = also { + whenever(InputSettings.isStylusEverUsed(mContext)).thenReturn(value) + } + + fun setUserUnlocked(value: Boolean) = also { + whenever(userManager.isUserUnlocked).thenReturn(value) + } + + fun setConfigSelections(vararg values: KeyguardQuickAffordanceConfig) = also { + val slotKey = "bottom-right" + val configSnapshots = values.toList() + val map = mapOf(slotKey to configSnapshots) + whenever(repository.selections).thenReturn(MutableStateFlow(map)) + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java index df3a62f6cd71..197b5970ed4c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java @@ -45,7 +45,6 @@ import androidx.test.filters.MediumTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.flags.FakeFeatureFlags; -import com.android.systemui.flags.Flags; import com.google.common.util.concurrent.ListenableFuture; @@ -110,7 +109,6 @@ public class ImageExporterTest extends SysuiTestCase { @Test public void testImageExport() throws ExecutionException, InterruptedException, IOException { ContentResolver contentResolver = mContext.getContentResolver(); - mFeatureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true); ImageExporter exporter = new ImageExporter(contentResolver, mFeatureFlags); UUID requestId = UUID.fromString("3c11da99-9284-4863-b1d5-6f3684976814"); @@ -189,7 +187,6 @@ public class ImageExporterTest extends SysuiTestCase { @Test public void testSetUser() { - mFeatureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true); ImageExporter exporter = new ImageExporter(mMockContentResolver, mFeatureFlags); UserHandle imageUserHande = UserHandle.of(10); @@ -207,24 +204,6 @@ public class ImageExporterTest extends SysuiTestCase { assertEquals(expected, uriCaptor.getValue()); } - @Test - public void testSetUser_noWorkProfile() { - mFeatureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false); - ImageExporter exporter = new ImageExporter(mMockContentResolver, mFeatureFlags); - - UserHandle imageUserHandle = UserHandle.of(10); - - ArgumentCaptor<Uri> uriCaptor = ArgumentCaptor.forClass(Uri.class); - // Capture the URI and then return null to bail out of export. - Mockito.when(mMockContentResolver.insert(uriCaptor.capture(), Mockito.any())).thenReturn( - null); - exporter.export(DIRECT_EXECUTOR, UUID.fromString("3c11da99-9284-4863-b1d5-6f3684976814"), - null, CAPTURE_TIME, imageUserHandle); - - // The user handle should be ignored here since the flag is off. - assertEquals(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, uriCaptor.getValue()); - } - @SuppressWarnings("SameParameterValue") private Bitmap createCheckerBitmap(int tileSize, int w, int h) { Bitmap bitmap = Bitmap.createBitmap(w * tileSize, h * tileSize, Bitmap.Config.ARGB_8888); diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt index 9f0a803fac40..d6720568cef5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/MessageContainerControllerTest.kt @@ -83,7 +83,6 @@ class MessageContainerControllerTest : SysuiTestCase() { @Test fun testOnScreenshotTakenUserHandle_noWorkProfileFirstRun() { - featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) // (just being explicit here) whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle))).thenReturn(null) @@ -93,18 +92,7 @@ class MessageContainerControllerTest : SysuiTestCase() { } @Test - fun testOnScreenshotTakenUserHandle_noWorkProfileFlag() { - featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - - messageContainer.onScreenshotTaken(userHandle) - - verify(workProfileMessageController, never()).onScreenshotTaken(any()) - verify(workProfileMessageController, never()).populateView(any(), any(), any()) - } - - @Test fun testOnScreenshotTakenUserHandle_withWorkProfileFirstRun() { - featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle))) .thenReturn(workProfileData) messageContainer.onScreenshotTaken(userHandle) @@ -116,21 +104,7 @@ class MessageContainerControllerTest : SysuiTestCase() { } @Test - fun testOnScreenshotTakenScreenshotData_flagsOff() { - featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - featureFlags.set(Flags.SCREENSHOT_DETECTION, false) - - messageContainer.onScreenshotTaken(screenshotData) - - verify(workProfileMessageController, never()).onScreenshotTaken(any()) - verify(screenshotDetectionController, never()).maybeNotifyOfScreenshot(any()) - - assertEquals(View.GONE, container.visibility) - } - - @Test fun testOnScreenshotTakenScreenshotData_nothingToShow() { - featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) featureFlags.set(Flags.SCREENSHOT_DETECTION, true) messageContainer.onScreenshotTaken(screenshotData) diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt index 2e73c0b5d0e3..1e47f78d42d1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt @@ -29,7 +29,6 @@ import android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE import com.android.internal.util.ScreenshotRequest import com.android.systemui.flags.FakeFeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope @@ -53,10 +52,10 @@ class RequestProcessorTest { /** Tests the Java-compatible function wrapper, ensures callback is invoked. */ @Test fun testProcessAsync() { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - val request = - ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build() + ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_KEY_OTHER) + .setBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)) + .build() val processor = RequestProcessor(imageCapture, policy, flags, scope) var result: ScreenshotRequest? = null @@ -77,11 +76,11 @@ class RequestProcessorTest { /** Tests the Java-compatible function wrapper, ensures callback is invoked. */ @Test fun testProcessAsync_ScreenshotData() { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - val request = ScreenshotData.fromRequest( - ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build() + ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_KEY_OTHER) + .setBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)) + .build() ) val processor = RequestProcessor(imageCapture, policy, flags, scope) @@ -101,28 +100,7 @@ class RequestProcessorTest { } @Test - fun testFullScreenshot_workProfilePolicyDisabled() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - - val request = - ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build() - val processor = RequestProcessor(imageCapture, policy, flags, scope) - - val processedRequest = processor.process(request) - - // No changes - assertThat(processedRequest).isEqualTo(request) - - val screenshotData = ScreenshotData.fromRequest(request) - val processedData = processor.process(screenshotData) - - assertThat(processedData).isEqualTo(screenshotData) - } - - @Test fun testFullScreenshot() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) - // Indicate that the primary content belongs to a normal user policy.setManagedProfile(USER_ID, false) policy.setDisplayContentInfo( @@ -151,8 +129,6 @@ class RequestProcessorTest { @Test fun testFullScreenshot_managedProfile() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) - // Provide a fake task bitmap when asked val bitmap = makeHardwareBitmap(100, 100) imageCapture.image = bitmap @@ -195,8 +171,6 @@ class RequestProcessorTest { @Test fun testFullScreenshot_managedProfile_nullBitmap() { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) - // Provide a null task bitmap when asked imageCapture.image = null @@ -220,39 +194,7 @@ class RequestProcessorTest { } @Test - fun testProvidedImageScreenshot_workProfilePolicyDisabled() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false) - - val bounds = Rect(50, 50, 150, 150) - val processor = RequestProcessor(imageCapture, policy, flags, scope) - - val bitmap = makeHardwareBitmap(100, 100) - - val request = - ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_OTHER) - .setTopComponent(component) - .setTaskId(TASK_ID) - .setUserId(USER_ID) - .setBitmap(bitmap) - .setBoundsOnScreen(bounds) - .setInsets(Insets.NONE) - .build() - - val processedRequest = processor.process(request) - - // No changes - assertThat(processedRequest).isEqualTo(request) - - val screenshotData = ScreenshotData.fromRequest(request) - val processedData = processor.process(screenshotData) - - assertThat(processedData).isEqualTo(screenshotData) - } - - @Test fun testProvidedImageScreenshot() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) - val bounds = Rect(50, 50, 150, 150) val processor = RequestProcessor(imageCapture, policy, flags, scope) @@ -283,8 +225,6 @@ class RequestProcessorTest { @Test fun testProvidedImageScreenshot_managedProfile() = runBlocking { - flags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true) - val bounds = Rect(50, 50, 150, 150) val processor = RequestProcessor(imageCapture, policy, flags, scope) diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt index c40c287df9e8..47d88a50695f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt @@ -39,7 +39,6 @@ import com.android.internal.util.ScreenshotRequest import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags.SCREENSHOT_METADATA_REFACTOR -import com.android.systemui.flags.Flags.SCREENSHOT_WORK_PROFILE_POLICY import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_REQUESTED_OVERVIEW @@ -125,7 +124,6 @@ class TakeScreenshotServiceTest : SysuiTestCase() { .processAsync(/* screenshot= */ any(ScreenshotData::class.java), /* callback= */ any()) // Flipped in selected test cases - flags.set(SCREENSHOT_WORK_PROFILE_POLICY, false) flags.set(SCREENSHOT_METADATA_REFACTOR, false) service.attach( diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index dd7929771bb2..526dc8d150fe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -223,16 +223,6 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { } @Test - public void attach_fadingAway_wallpaperVisible() { - clearInvocations(mWindowManager); - mNotificationShadeWindowController.attach(); - mNotificationShadeWindowController.setKeyguardFadingAway(true); - - verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture()); - assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) != 0).isTrue(); - } - - @Test public void setBackgroundBlurRadius_expandedWithBlurs() { mNotificationShadeWindowController.setBackgroundBlurRadius(10); verify(mNotificationShadeWindowView).setVisibility(eq(View.VISIBLE)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index 5f34b2f0f87f..006a7c735550 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -27,10 +27,12 @@ import com.android.keyguard.dagger.KeyguardBouncerComponent import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollectorFake +import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.dock.DockManager import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.KeyguardUnlockAnimationController +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel @@ -67,8 +69,8 @@ import org.mockito.Mockito.anyFloat import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -170,7 +172,13 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { MultiShadeMotionEventInteractor( applicationContext = context, applicationScope = testScope.backgroundScope, - interactor = multiShadeInteractor, + multiShadeInteractor = multiShadeInteractor, + keyguardTransitionInteractor = + KeyguardTransitionInteractor( + repository = FakeKeyguardTransitionRepository(), + ), + bouncerInteractor = com.android.systemui.util.mockito.mock(), + falsingManager = FalsingManagerFake(), ) }, ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt index b40181e24e6d..1a52067e8306 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -27,10 +27,12 @@ import com.android.keyguard.dagger.KeyguardBouncerComponent import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollectorFake +import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.dock.DockManager import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.KeyguardUnlockAnimationController +import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel @@ -182,7 +184,13 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { MultiShadeMotionEventInteractor( applicationContext = context, applicationScope = testScope.backgroundScope, - interactor = multiShadeInteractor, + multiShadeInteractor = multiShadeInteractor, + keyguardTransitionInteractor = + KeyguardTransitionInteractor( + repository = FakeKeyguardTransitionRepository(), + ), + bouncerInteractor = mock(), + falsingManager = FalsingManagerFake(), ) }, ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java index b6b0b7738997..9b6d29310d0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java @@ -41,6 +41,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.SysuiTestCase; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.notification.collection.GroupEntry; @@ -103,6 +104,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Mock private SecureSettings mSecureSettings; @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater(); private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider(); + @Mock private UserTracker mUserTracker; private NotifUiAdjustmentProvider mAdjustmentProvider; @@ -118,7 +120,8 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mHandler, mSecureSettings, mLockscreenUserManager, - mSectionStyleProvider); + mSectionStyleProvider, + mUserTracker); mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build(); mInflationError = new Exception(TEST_MESSAGE); mErrorManager = new NotifInflationErrorManager(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt index 246943e3088e..f9f8d8a2cfc6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt @@ -22,6 +22,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder @@ -53,6 +54,7 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { private val secureSettings: SecureSettings = mock() private val uri = FakeSettings().getUriFor(SHOW_NOTIFICATION_SNOOZE) private val dirtyListener: Runnable = mock() + private val userTracker: UserTracker = mock() private val section = NotifSection(mock(), 0) private val entry = NotificationEntryBuilder() @@ -67,13 +69,14 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { secureSettings, lockscreenUserManager, sectionStyleProvider, + userTracker ) @Before fun setup() { verifyNoMoreInteractions(secureSettings) adjustmentProvider.addDirtyListener(dirtyListener) - verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any()) + verify(secureSettings).getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any()) contentObserver = withArgCaptor { verify(secureSettings).registerContentObserverForUser( eq(SHOW_NOTIFICATION_SNOOZE), capture(), any() @@ -105,18 +108,20 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { fun onChangeWillQueryThenNotifyDirty() { contentObserver.onChange(false, listOf(uri), 0, 0) with(inOrder(secureSettings, dirtyListener)) { - verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any()) + verify(secureSettings).getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any()) verify(dirtyListener).run() } } @Test fun changingSnoozeChangesProvidedAdjustment() { - whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(0) + whenever(secureSettings.getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any())) + .thenReturn(0) val original = adjustmentProvider.calculateAdjustment(entry) assertThat(original.isSnoozeEnabled).isFalse() - whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(1) + whenever(secureSettings.getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any())) + .thenReturn(1) contentObserver.onChange(false, listOf(uri), 0, 0) val withSnoozing = adjustmentProvider.calculateAdjustment(entry) assertThat(withSnoozing.isSnoozeEnabled).isTrue() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java index e3516f97e827..e9290289f7f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java @@ -15,7 +15,6 @@ package com.android.systemui.statusbar.notification.row; import static android.provider.Settings.Global.SHOW_NEW_NOTIF_DISMISS; -import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE; import static android.view.HapticFeedbackConstants.CLOCK_TICK; import static junit.framework.Assert.assertEquals; @@ -100,7 +99,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testNoAppOpsInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 0); + when(mRow.getShowSnooze()).thenReturn(false); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -113,7 +112,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testNoSnoozeInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 0); + when(mRow.getShowSnooze()).thenReturn(false); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -126,7 +125,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testSnoozeInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 1); + when(mRow.getShowSnooze()).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -139,7 +138,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testSlowSwipe_newDismiss() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 1); + when(mRow.getShowSnooze()).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 1); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 1aba1fc37b64..7db219719bf0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -1342,18 +1342,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { } @Test - public void keyguard_notHidden_ifGoingAwayAndOccluded() { - setKeyguardShowingAndOccluded(true /* showing */, false /* occluded */); - - when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true); - when(mKeyguardStateController.isOccluded()).thenReturn(true); - - mCentralSurfaces.updateIsKeyguard(false); - - verify(mStatusBarStateController, never()).setState(eq(SHADE), anyBoolean()); - } - - @Test public void frpLockedDevice_shadeDisabled() { when(mDeviceProvisionedController.isFrpActive()).thenReturn(true); when(mDozeServiceHost.isPulsing()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt index 64810d2a9308..5c19108cc17e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt @@ -30,6 +30,7 @@ import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON +import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor @@ -43,6 +44,7 @@ import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiIntera import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel +import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -93,18 +95,23 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() { tableLogBuffer, scope, ) - viewModel = + val viewModelCommon = WifiViewModel( - airplaneModeViewModel, - connectivityConstants, - context, - tableLogBuffer, - interactor, - scope, - statusBarPipelineFlags, - wifiConstants, - ) - .home + airplaneModeViewModel, + connectivityConstants, + context, + tableLogBuffer, + interactor, + scope, + statusBarPipelineFlags, + wifiConstants, + ) + viewModel = + viewModelForLocation( + viewModelCommon, + statusBarPipelineFlags, + StatusBarLocation.HOME, + ) } // Note: The following tests are more like integration tests, since they stand up a full diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt index 1c71f8ba0aa3..ffe990bf1cf6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt @@ -130,7 +130,7 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase wifiConstants, ) - val iconFlow = underTest.home.wifiIcon + val iconFlow = underTest.wifiIcon val job = iconFlow.launchIn(this) // WHEN we set a certain network diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt index 7a62cb8a377d..802e360797a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor @@ -34,6 +35,7 @@ import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiIntera import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon +import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -105,15 +107,20 @@ class WifiViewModelTest : SysuiTestCase() { @Test fun wifiIcon_allLocationViewModelsReceiveSameData() = runBlocking(IMMEDIATE) { + val home = + viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.HOME) + val keyguard = + viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.KEYGUARD) + val qs = viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.QS) + var latestHome: WifiIcon? = null - val jobHome = underTest.home.wifiIcon.onEach { latestHome = it }.launchIn(this) + val jobHome = home.wifiIcon.onEach { latestHome = it }.launchIn(this) var latestKeyguard: WifiIcon? = null - val jobKeyguard = - underTest.keyguard.wifiIcon.onEach { latestKeyguard = it }.launchIn(this) + val jobKeyguard = keyguard.wifiIcon.onEach { latestKeyguard = it }.launchIn(this) var latestQs: WifiIcon? = null - val jobQs = underTest.qs.wifiIcon.onEach { latestQs = it }.launchIn(this) + val jobQs = qs.wifiIcon.onEach { latestQs = it }.launchIn(this) wifiRepository.setWifiNetwork( WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 1) @@ -138,15 +145,15 @@ class WifiViewModelTest : SysuiTestCase() { var activityIn: Boolean? = null val activityInJob = - underTest.home.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) + underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) var activityOut: Boolean? = null val activityOutJob = - underTest.home.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) + underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) var activityContainer: Boolean? = null val activityContainerJob = - underTest.home.isActivityContainerVisible + underTest.isActivityContainerVisible .onEach { activityContainer = it } .launchIn(this) @@ -169,15 +176,15 @@ class WifiViewModelTest : SysuiTestCase() { var activityIn: Boolean? = null val activityInJob = - underTest.home.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) + underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) var activityOut: Boolean? = null val activityOutJob = - underTest.home.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) + underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) var activityContainer: Boolean? = null val activityContainerJob = - underTest.home.isActivityContainerVisible + underTest.isActivityContainerVisible .onEach { activityContainer = it } .launchIn(this) @@ -208,15 +215,15 @@ class WifiViewModelTest : SysuiTestCase() { var activityIn: Boolean? = null val activityInJob = - underTest.home.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) + underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this) var activityOut: Boolean? = null val activityOutJob = - underTest.home.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) + underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this) var activityContainer: Boolean? = null val activityContainerJob = - underTest.home.isActivityContainerVisible + underTest.isActivityContainerVisible .onEach { activityContainer = it } .launchIn(this) @@ -242,18 +249,21 @@ class WifiViewModelTest : SysuiTestCase() { createAndSetViewModel() wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) + val home = + viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.HOME) + val keyguard = + viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.KEYGUARD) + val qs = viewModelForLocation(underTest, statusBarPipelineFlags, StatusBarLocation.QS) + var latestHome: Boolean? = null - val jobHome = - underTest.home.isActivityInViewVisible.onEach { latestHome = it }.launchIn(this) + val jobHome = home.isActivityInViewVisible.onEach { latestHome = it }.launchIn(this) var latestKeyguard: Boolean? = null val jobKeyguard = - underTest.keyguard.isActivityInViewVisible - .onEach { latestKeyguard = it } - .launchIn(this) + keyguard.isActivityInViewVisible.onEach { latestKeyguard = it }.launchIn(this) var latestQs: Boolean? = null - val jobQs = underTest.qs.isActivityInViewVisible.onEach { latestQs = it }.launchIn(this) + val jobQs = qs.isActivityInViewVisible.onEach { latestQs = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true) wifiRepository.setWifiActivity(activity) @@ -276,7 +286,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = underTest.home.isActivityInViewVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityInViewVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false) wifiRepository.setWifiActivity(activity) @@ -295,7 +305,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = underTest.home.isActivityInViewVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityInViewVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true) wifiRepository.setWifiActivity(activity) @@ -314,7 +324,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = underTest.home.isActivityOutViewVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityOutViewVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true) wifiRepository.setWifiActivity(activity) @@ -333,7 +343,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = underTest.home.isActivityOutViewVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityOutViewVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false) wifiRepository.setWifiActivity(activity) @@ -352,8 +362,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = - underTest.home.isActivityContainerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false) wifiRepository.setWifiActivity(activity) @@ -372,8 +381,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = - underTest.home.isActivityContainerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true) wifiRepository.setWifiActivity(activity) @@ -392,8 +400,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = - underTest.home.isActivityContainerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true) wifiRepository.setWifiActivity(activity) @@ -412,8 +419,7 @@ class WifiViewModelTest : SysuiTestCase() { wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK) var latest: Boolean? = null - val job = - underTest.home.isActivityContainerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this) val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = false) wifiRepository.setWifiActivity(activity) @@ -428,7 +434,7 @@ class WifiViewModelTest : SysuiTestCase() { fun airplaneSpacer_notAirplaneMode_outputsFalse() = runBlocking(IMMEDIATE) { var latest: Boolean? = null - val job = underTest.qs.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) airplaneModeRepository.setIsAirplaneMode(false) yield() @@ -442,7 +448,7 @@ class WifiViewModelTest : SysuiTestCase() { fun airplaneSpacer_airplaneForceHidden_outputsFalse() = runBlocking(IMMEDIATE) { var latest: Boolean? = null - val job = underTest.qs.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) airplaneModeRepository.setIsAirplaneMode(true) connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.AIRPLANE)) @@ -457,7 +463,7 @@ class WifiViewModelTest : SysuiTestCase() { fun airplaneSpacer_airplaneIconVisible_outputsTrue() = runBlocking(IMMEDIATE) { var latest: Boolean? = null - val job = underTest.qs.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) + val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this) airplaneModeRepository.setIsAirplaneMode(true) yield() diff --git a/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java index a7072225baa7..667099718788 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java @@ -28,6 +28,7 @@ import android.graphics.Region; import android.testing.AndroidTestingRunner; import android.view.AttachedSurfaceControl; import android.view.View; +import android.view.ViewGroup; import androidx.test.filters.SmallTest; @@ -49,6 +50,9 @@ public class TouchInsetManagerTest extends SysuiTestCase { @Mock private AttachedSurfaceControl mAttachedSurfaceControl; + @Mock + private ViewGroup mRootView; + private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); @Before @@ -228,10 +232,11 @@ public class TouchInsetManagerTest extends SysuiTestCase { private View createView(Rect bounds) { final Rect rect = new Rect(bounds); final View view = Mockito.mock(View.class); + when(view.getRootView()).thenReturn(mRootView); doAnswer(invocation -> { ((Rect) invocation.getArgument(0)).set(rect); return null; - }).when(view).getBoundsOnScreen(any()); + }).when(view).getDrawingRect(any()); when(view.isAttachedToWindow()).thenReturn(true); when(view.getRootSurfaceControl()).thenReturn(mAttachedSurfaceControl); diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiverTest.kt index 0e7e039e69e2..4989a21791fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiverTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiverTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.unfold.progress import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry import com.android.systemui.SysuiTestCase import org.junit.Before import org.junit.Test @@ -27,23 +28,27 @@ import org.junit.runner.RunWith @SmallTest class RemoteUnfoldTransitionReceiverTest : SysuiTestCase() { - private val progressProvider = RemoteUnfoldTransitionReceiver { it.run() } + private val progressProvider = + RemoteUnfoldTransitionReceiver(useReceivingFilter = true) { runOnMainSync(it) } + private val progressProviderWithoutFilter = + RemoteUnfoldTransitionReceiver(useReceivingFilter = false) { it.run() } private val listener = TestUnfoldProgressListener() @Before fun setUp() { progressProvider.addCallback(listener) + progressProviderWithoutFilter.addCallback(listener) } @Test - fun onTransitionStarted_propagated() { + fun onTransitionStarted_withFilter_propagated() { progressProvider.onTransitionStarted() listener.assertStarted() } @Test - fun onTransitionProgress_propagated() { + fun onTransitionProgress_withFilter_propagated() { progressProvider.onTransitionStarted() progressProvider.onTransitionProgress(0.5f) @@ -52,7 +57,7 @@ class RemoteUnfoldTransitionReceiverTest : SysuiTestCase() { } @Test - fun onTransitionEnded_propagated() { + fun onTransitionEnded_withFilter_propagated() { progressProvider.onTransitionStarted() progressProvider.onTransitionProgress(0.5f) @@ -62,11 +67,52 @@ class RemoteUnfoldTransitionReceiverTest : SysuiTestCase() { } @Test - fun onTransitionStarted_afterCallbackRemoved_notPropagated() { + fun onTransitionStarted_withFilter_afterCallbackRemoved_notPropagated() { progressProvider.removeCallback(listener) progressProvider.onTransitionStarted() listener.assertNotStarted() } + + @Test + fun onTransitionStarted_withoutFilter_propagated() { + progressProviderWithoutFilter.onTransitionStarted() + + listener.assertStarted() + } + + @Test + fun onTransitionProgress_withoutFilter_propagated() { + progressProviderWithoutFilter.onTransitionStarted() + + progressProviderWithoutFilter.onTransitionProgress(0.5f) + + listener.assertLastProgress(0.5f) + } + + @Test + fun onTransitionEnded_withoutFilter_propagated() { + progressProviderWithoutFilter.onTransitionStarted() + progressProviderWithoutFilter.onTransitionProgress(0.5f) + + progressProviderWithoutFilter.onTransitionFinished() + + listener.ensureTransitionFinished() + } + + @Test + fun onTransitionStarted_withoutFilter_afterCallbackRemoved_notPropagated() { + progressProviderWithoutFilter.removeCallback(listener) + + progressProviderWithoutFilter.onTransitionStarted() + + listener.assertNotStarted() + } + + private fun runOnMainSync(f: Runnable) { + InstrumentationRegistry.getInstrumentation().runOnMainSync { f.run() } + // Sleep as the animator used from the filter has a callback that happens at every frame. + Thread.sleep(60) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt index f6532070d720..1ce25725b298 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt @@ -126,7 +126,7 @@ class TestUnfoldProgressListener : UnfoldTransitionProgressProvider.TransitionPr } fun assertLastProgress(progress: Float) { - assertThat(progressHistory.last()).isEqualTo(progress) + assertThat(progressHistory.last()).isWithin(1.0E-4F).of(progress) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt new file mode 100644 index 000000000000..f14009aad033 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/UnfoldRemoteFilterTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.unfold.progress + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import com.android.systemui.SysuiTestCase +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class UnfoldRemoteFilterTest : SysuiTestCase() { + private val listener = TestUnfoldProgressListener() + + private val progressProvider = UnfoldRemoteFilter(listener) + + @Test + fun onTransitionStarted_propagated() { + runOnMainThreadWithInterval({ progressProvider.onTransitionStarted() }) + listener.assertStarted() + } + + @Test + fun onTransitionProgress_withInterval_propagated() { + runOnMainThreadWithInterval( + { progressProvider.onTransitionStarted() }, + { progressProvider.onTransitionProgress(0.5f) } + ) + + listener.assertLastProgress(0.5f) + } + + @Test + fun onTransitionEnded_propagated() { + runOnMainThreadWithInterval( + { progressProvider.onTransitionStarted() }, + { progressProvider.onTransitionProgress(0.5f) }, + { progressProvider.onTransitionFinished() }, + ) + + listener.ensureTransitionFinished() + } + + private fun runOnMainThreadWithInterval( + vararg blocks: () -> Unit, + interval: Duration = 60.milliseconds + ) { + blocks.forEach { + InstrumentationRegistry.getInstrumentation().runOnMainSync { it() } + Thread.sleep(interval.inWholeMilliseconds) + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsControllerTest.kt index b52786178e71..9bd3a799350d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsControllerTest.kt @@ -32,9 +32,9 @@ import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat -import java.util.ArrayList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent @@ -46,7 +46,7 @@ import org.junit.runners.JUnit4 import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock -import org.mockito.Mockito.isNull +import org.mockito.Mockito.anyInt import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -66,12 +66,14 @@ class WalletContextualSuggestionsControllerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) + whenever(broadcastDispatcher.broadcastFlow(any(), nullable(), anyInt(), nullable())) + .thenCallRealMethod() whenever( - broadcastDispatcher.broadcastFlow<List<String>?>( - any(), - isNull(), - any(), + broadcastDispatcher.broadcastFlow<Unit>( any(), + nullable(), + anyInt(), + nullable(), any() ) ) @@ -81,95 +83,85 @@ class WalletContextualSuggestionsControllerTest : SysuiTestCase() { .thenReturn(true) whenever(CARD_1.cardId).thenReturn(ID_1) + whenever(CARD_1.cardType).thenReturn(WalletCard.CARD_TYPE_NON_PAYMENT) whenever(CARD_2.cardId).thenReturn(ID_2) + whenever(CARD_2.cardType).thenReturn(WalletCard.CARD_TYPE_NON_PAYMENT) whenever(CARD_3.cardId).thenReturn(ID_3) + whenever(CARD_3.cardType).thenReturn(WalletCard.CARD_TYPE_NON_PAYMENT) + whenever(PAYMENT_CARD.cardId).thenReturn(PAYMENT_ID) + whenever(PAYMENT_CARD.cardType).thenReturn(WalletCard.CARD_TYPE_PAYMENT) } @Test - fun `state - has wallet cards - received contextual cards`() = runTest { - setUpWalletClient(listOf(CARD_1, CARD_2)) - val latest = - collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, - ) + fun `state - has wallet cards- callbacks called`() = runTest { + setUpWalletClient(listOf(CARD_1, CARD_2, PAYMENT_CARD)) + val controller = createWalletContextualSuggestionsController(backgroundScope) + var latest1 = emptyList<WalletCard>() + var latest2 = emptyList<WalletCard>() + val callback1: (List<WalletCard>) -> Unit = { latest1 = it } + val callback2: (List<WalletCard>) -> Unit = { latest2 = it } runCurrent() - verifyRegistered() - broadcastReceiver.value.onReceive( - mockContext, - createContextualCardsIntent(listOf(ID_1, ID_2)) - ) + controller.registerWalletCardsReceivedCallback(callback1) + controller.registerWalletCardsReceivedCallback(callback2) + controller.unregisterWalletCardsReceivedCallback(callback2) + runCurrent() + verifyBroadcastReceiverRegistered() + turnScreenOn() + runCurrent() - assertThat(latest()).containsExactly(CARD_1, CARD_2) + assertThat(latest1).containsExactly(CARD_1, CARD_2) + assertThat(latest2).isEmpty() } @Test - fun `state - no wallet cards - received contextual cards`() = runTest { + fun `state - no wallet cards - set suggestion cards`() = runTest { setUpWalletClient(emptyList()) + val controller = createWalletContextualSuggestionsController(backgroundScope) val latest = collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, + controller.contextualSuggestionCards, ) runCurrent() - verifyRegistered() - broadcastReceiver.value.onReceive( - mockContext, - createContextualCardsIntent(listOf(ID_1, ID_2)) - ) + verifyBroadcastReceiverRegistered() + turnScreenOn() + controller.setSuggestionCardIds(setOf(ID_1, ID_2)) assertThat(latest()).isEmpty() } @Test - fun `state - has wallet cards - no contextual cards`() = runTest { - setUpWalletClient(listOf(CARD_1, CARD_2)) + fun `state - has wallet cards - set and update suggestion cards`() = runTest { + setUpWalletClient(listOf(CARD_1, CARD_2, PAYMENT_CARD)) + val controller = createWalletContextualSuggestionsController(backgroundScope) val latest = collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, + controller.contextualSuggestionCards, ) runCurrent() - verifyRegistered() - broadcastReceiver.value.onReceive(mockContext, createContextualCardsIntent(emptyList())) + verifyBroadcastReceiverRegistered() + turnScreenOn() + controller.setSuggestionCardIds(setOf(ID_1, ID_2)) + assertThat(latest()).containsExactly(CARD_1, CARD_2) + controller.setSuggestionCardIds(emptySet()) assertThat(latest()).isEmpty() } @Test fun `state - wallet cards error`() = runTest { setUpWalletClient(shouldFail = true) + val controller = createWalletContextualSuggestionsController(backgroundScope) val latest = collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, - ) - - runCurrent() - verifyRegistered() - broadcastReceiver.value.onReceive( - mockContext, - createContextualCardsIntent(listOf(ID_1, ID_2)) - ) - - assertThat(latest()).isEmpty() - } - - @Test - fun `state - no contextual cards extra`() = runTest { - setUpWalletClient(listOf(CARD_1, CARD_2)) - val latest = - collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, + controller.contextualSuggestionCards, ) runCurrent() - verifyRegistered() - broadcastReceiver.value.onReceive(mockContext, Intent(INTENT_NAME)) + verifyBroadcastReceiverRegistered() + controller.setSuggestionCardIds(setOf(ID_1, ID_2)) assertThat(latest()).isEmpty() } @@ -178,16 +170,18 @@ class WalletContextualSuggestionsControllerTest : SysuiTestCase() { fun `state - has wallet cards - received contextual cards - feature disabled`() = runTest { whenever(featureFlags.isEnabled(eq(Flags.ENABLE_WALLET_CONTEXTUAL_LOYALTY_CARDS))) .thenReturn(false) - setUpWalletClient(listOf(CARD_1, CARD_2)) + setUpWalletClient(listOf(CARD_1, CARD_2, PAYMENT_CARD)) + val controller = createWalletContextualSuggestionsController(backgroundScope) val latest = collectLastValue( - createWalletContextualSuggestionsController(backgroundScope) - .contextualSuggestionCards, + controller.contextualSuggestionCards, ) runCurrent() - verify(broadcastDispatcher, never()).broadcastFlow(any(), isNull(), any(), any()) - assertThat(latest()).isNull() + verify(broadcastDispatcher, never()).broadcastFlow(any(), nullable(), anyInt(), nullable()) + controller.setSuggestionCardIds(setOf(ID_1, ID_2)) + + assertThat(latest()).isEmpty() } private fun createWalletContextualSuggestionsController( @@ -201,17 +195,20 @@ class WalletContextualSuggestionsControllerTest : SysuiTestCase() { ) } - private fun verifyRegistered() { + private fun verifyBroadcastReceiverRegistered() { verify(broadcastDispatcher) - .registerReceiver(capture(broadcastReceiver), any(), isNull(), isNull(), any(), any()) + .registerReceiver( + capture(broadcastReceiver), + any(), + nullable(), + nullable(), + anyInt(), + nullable() + ) } - private fun createContextualCardsIntent( - ids: List<String> = emptyList(), - ): Intent { - val intent = Intent(INTENT_NAME) - intent.putStringArrayListExtra("cardIds", ArrayList(ids)) - return intent + private fun turnScreenOn() { + broadcastReceiver.value.onReceive(mockContext, Intent(Intent.ACTION_SCREEN_ON)) } private fun setUpWalletClient( @@ -238,6 +235,7 @@ class WalletContextualSuggestionsControllerTest : SysuiTestCase() { private val CARD_2: WalletCard = mock() private const val ID_3: String = "789" private val CARD_3: WalletCard = mock() - private val INTENT_NAME: String = "WalletSuggestionsIntent" + private const val PAYMENT_ID: String = "payment" + private val PAYMENT_CARD: WalletCard = mock() } } diff --git a/packages/SystemUI/tests/utils/AndroidManifest.xml b/packages/SystemUI/tests/utils/AndroidManifest.xml deleted file mode 100644 index cbef5f6036ab..000000000000 --- a/packages/SystemUI/tests/utils/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2022 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.systemui.tests.utils"> - - -</manifest> - diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/activity/EmptyTestActivity.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/activity/EmptyTestActivity.kt new file mode 100644 index 000000000000..22ac3d72ae48 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/activity/EmptyTestActivity.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.activity + +import android.app.Activity + +/** + * This activity does nothing. You can use it with [ActivityScenario] or [ActivityScenarioRule] to + * run activity-independent tests + */ +class EmptyTestActivity : Activity() diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/Flow.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/Flow.kt index c2947b42f56d..e1ba074ac860 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/Flow.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/coroutines/Flow.kt @@ -14,6 +14,8 @@ * limitations under the License. */ +@file:Suppress("OPT_IN_USAGE") + package com.android.systemui.coroutines import kotlin.coroutines.CoroutineContext @@ -43,20 +45,55 @@ fun <T> TestScope.collectLastValue( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, ): FlowValue<T?> { - var lastValue: T? = null - backgroundScope.launch(context, start) { flow.collect { lastValue = it } } - return FlowValueImpl { + val values by + collectValues( + flow = flow, + context = context, + start = start, + ) + return FlowValueImpl { values.lastOrNull() } +} + +/** + * Collect [flow] in a new [Job] and return a getter for the collection of values collected. + * + * ``` + * fun myTest() = runTest { + * // ... + * val values by collectValues(underTest.flow) + * assertThat(values).isEqualTo(listOf(expected1, expected2, ...)) + * } + * ``` + */ +fun <T> TestScope.collectValues( + flow: Flow<T>, + context: CoroutineContext = EmptyCoroutineContext, + start: CoroutineStart = CoroutineStart.DEFAULT, +): FlowValues<T> { + val values = mutableListOf<T>() + backgroundScope.launch(context, start) { flow.collect(values::add) } + return FlowValuesImpl { runCurrent() - lastValue + values.toList() } } /** @see collectLastValue */ -interface FlowValue<T> : ReadOnlyProperty<Any?, T?> { - operator fun invoke(): T? +interface FlowValue<T> : ReadOnlyProperty<Any?, T> { + operator fun invoke(): T +} + +/** @see collectValues */ +interface FlowValues<T> : ReadOnlyProperty<Any?, List<T>> { + operator fun invoke(): List<T> +} + +private class FlowValueImpl<T>(private val block: () -> T) : FlowValue<T> { + override operator fun invoke(): T = block() + override fun getValue(thisRef: Any?, property: KProperty<*>): T = invoke() } -private class FlowValueImpl<T>(private val block: () -> T?) : FlowValue<T> { - override operator fun invoke(): T? = block() - override fun getValue(thisRef: Any?, property: KProperty<*>): T? = invoke() +private class FlowValuesImpl<T>(private val block: () -> List<T>) : FlowValues<T> { + override operator fun invoke(): List<T> = block() + override fun getValue(thisRef: Any?, property: KProperty<*>): List<T> = invoke() } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt index b395d9c07662..a639df539cb9 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt @@ -17,6 +17,7 @@ package com.android.systemui.unfold import com.android.systemui.unfold.config.UnfoldTransitionConfig +import com.android.systemui.unfold.dagger.UseReceivingFilter import com.android.systemui.unfold.progress.RemoteUnfoldTransitionReceiver import com.android.systemui.unfold.util.ATraceLoggerTransitionProgressListener import dagger.Module @@ -42,4 +43,6 @@ class UnfoldRemoteModule { remoteReceiver.addCallback(traceListener) return Optional.of(remoteReceiver) } + + @Provides @UseReceivingFilter fun useReceivingFilter(): Boolean = true } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UseReceivingFilter.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UseReceivingFilter.kt new file mode 100644 index 000000000000..60e9307e8457 --- /dev/null +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UseReceivingFilter.kt @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.android.systemui.unfold.dagger + +import javax.inject.Qualifier + +/** Annotates whether to use a filter in [RemoteUnfoldTransitionReceiver]. */ +@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class UseReceivingFilter diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiver.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiver.kt index 5e4bcc97520e..b2c26c455b76 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiver.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiver.kt @@ -16,9 +16,13 @@ package com.android.systemui.unfold.progress +import android.util.Log +import androidx.annotation.BinderThread +import androidx.annotation.FloatRange import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.dagger.UnfoldMain +import com.android.systemui.unfold.dagger.UseReceivingFilter import java.util.concurrent.Executor import javax.inject.Inject @@ -30,21 +34,40 @@ import javax.inject.Inject */ class RemoteUnfoldTransitionReceiver @Inject -constructor(@UnfoldMain private val executor: Executor) : - UnfoldTransitionProgressProvider, IUnfoldTransitionListener.Stub() { +constructor( + @UseReceivingFilter useReceivingFilter: Boolean, + @UnfoldMain private val executor: Executor +) : UnfoldTransitionProgressProvider, IUnfoldTransitionListener.Stub() { private val listeners: MutableSet<TransitionProgressListener> = mutableSetOf() + private val outputProgressListener = ProcessedProgressListener() + private val filter: TransitionProgressListener? = + if (useReceivingFilter) { + UnfoldRemoteFilter(outputProgressListener) + } else { + null + } + @BinderThread override fun onTransitionStarted() { - executor.execute { listeners.forEach { it.onTransitionStarted() } } + executor.execute { + filter?.onTransitionStarted() ?: outputProgressListener.onTransitionStarted() + } } + @BinderThread override fun onTransitionProgress(progress: Float) { - executor.execute { listeners.forEach { it.onTransitionProgress(progress) } } + executor.execute { + filter?.onTransitionProgress(progress) + ?: outputProgressListener.onTransitionProgress(progress) + } } + @BinderThread override fun onTransitionFinished() { - executor.execute { listeners.forEach { it.onTransitionFinished() } } + executor.execute { + filter?.onTransitionFinished() ?: outputProgressListener.onTransitionFinished() + } } override fun addCallback(listener: TransitionProgressListener) { @@ -58,4 +81,30 @@ constructor(@UnfoldMain private val executor: Executor) : override fun destroy() { listeners.clear() } + + private inner class ProcessedProgressListener : TransitionProgressListener { + override fun onTransitionStarted() { + log { "onTransitionStarted" } + listeners.forEach { it.onTransitionStarted() } + } + + override fun onTransitionProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) { + log { "onTransitionProgress" } + listeners.forEach { it.onTransitionProgress(progress) } + } + + override fun onTransitionFinished() { + log { "onTransitionFinished" } + listeners.forEach { it.onTransitionFinished() } + } + } + + private fun log(s: () -> String) { + if (DEBUG) { + Log.d(TAG, s()) + } + } } + +private const val TAG = "RemoteUnfoldReceiver" +private val DEBUG = false diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt new file mode 100644 index 000000000000..0b019d1285e3 --- /dev/null +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/UnfoldRemoteFilter.kt @@ -0,0 +1,85 @@ +package com.android.systemui.unfold.progress + +import android.os.Trace +import android.util.Log +import androidx.dynamicanimation.animation.FloatPropertyCompat +import androidx.dynamicanimation.animation.SpringAnimation +import androidx.dynamicanimation.animation.SpringForce +import com.android.systemui.unfold.UnfoldTransitionProgressProvider + +/** + * Makes progress received from other processes resilient to jank. + * + * Sender and receiver processes might have different frame-rates. If the sending process is + * dropping a frame due to jank (or generally because it's main thread is too busy), we don't want + * the receiving process to drop progress frames as well. For this reason, a spring animator pass + * (with very high stiffness) is applied to the incoming progress. This adds a small delay to the + * progress (~30ms), but guarantees an always smooth animation on the receiving end. + */ +class UnfoldRemoteFilter( + private val listener: UnfoldTransitionProgressProvider.TransitionProgressListener +) : UnfoldTransitionProgressProvider.TransitionProgressListener { + + private val springAnimation = + SpringAnimation(this, AnimationProgressProperty).apply { + spring = + SpringForce().apply { + dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY + stiffness = 100_000f + finalPosition = 1.0f + } + setMinValue(0f) + setMaxValue(1f) + minimumVisibleChange = 0.001f + } + + private var inProgress = false + + private var processedProgress: Float = 0.0f + set(newProgress) { + if (inProgress) { + logCounter({ "$TAG#filtered_progress" }, newProgress) + listener.onTransitionProgress(newProgress) + } else { + Log.e(TAG, "Filtered progress received received while animation not in progress.") + } + field = newProgress + } + + override fun onTransitionStarted() { + listener.onTransitionStarted() + inProgress = true + } + + override fun onTransitionProgress(progress: Float) { + logCounter({ "$TAG#plain_remote_progress" }, progress) + if (inProgress) { + springAnimation.animateToFinalPosition(progress) + } else { + Log.e(TAG, "Progress received while not in progress.") + } + } + + override fun onTransitionFinished() { + inProgress = false + listener.onTransitionFinished() + } + + private object AnimationProgressProperty : + FloatPropertyCompat<UnfoldRemoteFilter>("UnfoldRemoteFilter") { + + override fun setValue(provider: UnfoldRemoteFilter, value: Float) { + provider.processedProgress = value + } + + override fun getValue(provider: UnfoldRemoteFilter): Float = provider.processedProgress + } + private fun logCounter(name: () -> String, progress: Float) { + if (DEBUG) { + Trace.setCounter(name(), (progress * 100).toLong()) + } + } +} + +private val TAG = "UnfoldRemoteFilter" +private val DEBUG = false diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 4753a545adb0..22e742bc0973 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -167,13 +167,19 @@ public class MagnificationController implements WindowMagnificationManager.Callb @Override public void onPerformScaleAction(int displayId, float scale) { - getWindowMagnificationMgr().setScale(displayId, scale); - getWindowMagnificationMgr().persistScale(displayId); + if (getFullScreenMagnificationController().isActivated(displayId)) { + getFullScreenMagnificationController().setScaleAndCenter(displayId, scale, + Float.NaN, Float.NaN, false, MAGNIFICATION_GESTURE_HANDLER_ID); + getFullScreenMagnificationController().persistScale(displayId); + } else if (getWindowMagnificationMgr().isWindowMagnifierEnabled(displayId)) { + getWindowMagnificationMgr().setScale(displayId, scale); + getWindowMagnificationMgr().persistScale(displayId); + } } @Override public void onAccessibilityActionPerformed(int displayId) { - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Override @@ -190,21 +196,22 @@ public class MagnificationController implements WindowMagnificationManager.Callb if (mMagnificationCapabilities != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) { return; } - if (isActivated(displayId, mode)) { - getWindowMagnificationMgr().showMagnificationButton(displayId, mode); - } + updateMagnificationUIControls(displayId, mode); } - private void updateMagnificationButton(int displayId, int mode) { + private void updateMagnificationUIControls(int displayId, int mode) { final boolean isActivated = isActivated(displayId, mode); - final boolean showButton; + final boolean showUIControls; synchronized (mLock) { - showButton = isActivated && mMagnificationCapabilities + showUIControls = isActivated && mMagnificationCapabilities == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; } - if (showButton) { + if (showUIControls) { + // we only need to show magnification button, the settings panel showing should be + // triggered only on sysui side. getWindowMagnificationMgr().showMagnificationButton(displayId, mode); } else { + getWindowMagnificationMgr().removeMagnificationSettingsPanel(displayId); getWindowMagnificationMgr().removeMagnificationButton(displayId); } } @@ -427,7 +434,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb public void onRequestMagnificationSpec(int displayId, int serviceId) { final WindowMagnificationManager windowMagnificationManager; synchronized (mLock) { - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); windowMagnificationManager = mWindowMagnificationMgr; } if (windowMagnificationManager != null) { @@ -456,7 +463,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb } logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, duration); } - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Override @@ -554,7 +561,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb } logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, duration); } - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); } private void disableWindowMagnificationIfNeeded(int displayId) { @@ -872,7 +879,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb mAms.notifyMagnificationChanged(mDisplayId, region, configBuilder.build()); } } - updateMagnificationButton(mDisplayId, mTargetMode); + updateMagnificationUIControls(mDisplayId, mTargetMode); if (mTransitionCallBack != null) { mTransitionCallBack.onResult(mDisplayId, success); } @@ -900,7 +907,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb setExpiredAndRemoveFromListLocked(); setTransitionState(mDisplayId, null); applyMagnificationModeLocked(mCurrentMode); - updateMagnificationButton(mDisplayId, mCurrentMode); + updateMagnificationUIControls(mDisplayId, mCurrentMode); if (mTransitionCallBack != null) { mTransitionCallBack.onResult(mDisplayId, true); } diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java index 041eece5ce48..1202cfadb44e 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java @@ -185,6 +185,22 @@ class WindowMagnificationConnectionWrapper { return true; } + boolean removeMagnificationSettingsPanel(int displayId) { + if (mTrace.isA11yTracingEnabledForTypes(FLAGS_WINDOW_MAGNIFICATION_CONNECTION)) { + mTrace.logTrace(TAG + ".removeMagnificationSettingsPanel", + FLAGS_WINDOW_MAGNIFICATION_CONNECTION, "displayId=" + displayId); + } + try { + mConnection.removeMagnificationSettingsPanel(displayId); + } catch (RemoteException e) { + if (DBG) { + Slog.e(TAG, "Error calling removeMagnificationSettingsPanel()", e); + } + return false; + } + return true; + } + boolean setConnectionCallback(IWindowMagnificationConnectionCallback connectionCallback) { if (mTrace.isA11yTracingEnabledForTypes( FLAGS_WINDOW_MAGNIFICATION_CONNECTION diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java index d9391f422dc7..ce18b2cf9bad 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -779,8 +779,10 @@ public class WindowMagnificationManager implements * @return {@code true} if the event was handled, {@code false} otherwise */ public boolean showMagnificationButton(int displayId, int magnificationMode) { - return mConnectionWrapper != null && mConnectionWrapper.showMagnificationButton( - displayId, magnificationMode); + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.showMagnificationButton(displayId, magnificationMode); + } } /** @@ -790,8 +792,23 @@ public class WindowMagnificationManager implements * @return {@code true} if the event was handled, {@code false} otherwise */ public boolean removeMagnificationButton(int displayId) { - return mConnectionWrapper != null && mConnectionWrapper.removeMagnificationButton( - displayId); + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.removeMagnificationButton(displayId); + } + } + + /** + * Requests System UI remove magnification settings panel on the specified display. + * + * @param displayId The logical display id. + * @return {@code true} if the event was handled, {@code false} otherwise + */ + public boolean removeMagnificationSettingsPanel(int displayId) { + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.removeMagnificationSettingsPanel(displayId); + } } /** diff --git a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java index 05b6022ce569..a8519e388525 100644 --- a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java +++ b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java @@ -128,6 +128,9 @@ public class SecureChannel { * Start listening for incoming messages. */ public void start() { + if (DEBUG) { + Slog.d(TAG, "Starting secure channel."); + } new Thread(() -> { try { // 1. Wait for the next handshake message and process it. @@ -151,14 +154,14 @@ public class SecureChannel { // TODO: Handle different types errors. Slog.e(TAG, "Secure channel encountered an error.", e); - stop(); + close(); mCallback.onError(e); } }).start(); } /** - * Stop listening to incoming messages and close the channel. + * Stop listening to incoming messages. */ public void stop() { if (DEBUG) { @@ -166,7 +169,17 @@ public class SecureChannel { } mStopped = true; mInProgress = false; + } + + /** + * Stop listening to incoming messages and close the channel. + */ + public void close() { + stop(); + if (DEBUG) { + Slog.d(TAG, "Closing secure channel."); + } IoUtils.closeQuietly(mInput); IoUtils.closeQuietly(mOutput); KeyStoreUtils.cleanUp(mAlias); @@ -240,60 +253,64 @@ public class SecureChannel { if (isSecured()) { Slog.d(TAG, "Waiting to receive next secure message."); } else { - Slog.d(TAG, "Waiting to receive next message."); + Slog.d(TAG, "Waiting to receive next " + expected + " message."); } } // TODO: Handle message timeout - // Header is _not_ encrypted, but will be covered by MAC - final byte[] headerBytes = new byte[HEADER_LENGTH]; - Streams.readFully(mInput, headerBytes); - final ByteBuffer header = ByteBuffer.wrap(headerBytes); - final int version = header.getInt(); - final short type = header.getShort(); + synchronized (mInput) { + // Header is _not_ encrypted, but will be covered by MAC + final byte[] headerBytes = new byte[HEADER_LENGTH]; + Streams.readFully(mInput, headerBytes); + final ByteBuffer header = ByteBuffer.wrap(headerBytes); + final int version = header.getInt(); + final short type = header.getShort(); + + if (version != VERSION) { + Streams.skipByReading(mInput, Long.MAX_VALUE); + throw new SecureChannelException("Secure channel version mismatch. " + + "Currently on version " + VERSION + ". Skipping rest of data."); + } - if (version != VERSION) { - Streams.skipByReading(mInput, Long.MAX_VALUE); - throw new SecureChannelException("Secure channel version mismatch. " - + "Currently on version " + VERSION + ". Skipping rest of data."); - } + if (type != expected.mValue) { + Streams.skipByReading(mInput, Long.MAX_VALUE); + throw new SecureChannelException( + "Unexpected message type. Expected " + expected.name() + + "; Found " + MessageType.from(type).name() + + ". Skipping rest of data."); + } - if (type != expected.mValue) { - Streams.skipByReading(mInput, Long.MAX_VALUE); - throw new SecureChannelException("Unexpected message type. Expected " + expected.name() - + "; Found " + MessageType.from(type).name() + ". Skipping rest of data."); - } + // Length of attached data is prepended as plaintext + final byte[] lengthBytes = new byte[4]; + Streams.readFully(mInput, lengthBytes); + final int length = ByteBuffer.wrap(lengthBytes).getInt(); - // Length of attached data is prepended as plaintext - final byte[] lengthBytes = new byte[4]; - Streams.readFully(mInput, lengthBytes); - final int length = ByteBuffer.wrap(lengthBytes).getInt(); + // Read data based on the length + final byte[] data; + try { + data = new byte[length]; + } catch (OutOfMemoryError error) { + throw new SecureChannelException("Payload is too large.", error); + } - // Read data based on the length - final byte[] data; - try { - data = new byte[length]; - } catch (OutOfMemoryError error) { - throw new SecureChannelException("Payload is too large.", error); - } + Streams.readFully(mInput, data); + if (!MessageType.shouldEncrypt(expected)) { + return data; + } - Streams.readFully(mInput, data); - if (!MessageType.shouldEncrypt(expected)) { - return data; + return mConnectionContext.decodeMessageFromPeer(data, headerBytes); } - - return mConnectionContext.decodeMessageFromPeer(data, headerBytes); } - private void sendMessage(MessageType messageType, byte[] payload) + private void sendMessage(MessageType messageType, final byte[] payload) throws IOException, BadHandleException { synchronized (mOutput) { - byte[] header = ByteBuffer.allocate(HEADER_LENGTH) + final byte[] header = ByteBuffer.allocate(HEADER_LENGTH) .putInt(VERSION) .putShort(messageType.mValue) .array(); - byte[] data = MessageType.shouldEncrypt(messageType) + final byte[] data = MessageType.shouldEncrypt(messageType) ? mConnectionContext.encodeMessageToPeer(payload, header) : payload; mOutput.write(header); diff --git a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java index 539020519f84..092eb4ea9014 100644 --- a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java +++ b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java @@ -46,6 +46,7 @@ import com.android.server.companion.AssociationStore; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -296,26 +297,32 @@ public class CompanionTransportManager { Slog.i(TAG, "Remote device SDK: " + remoteSdk + ", release:" + new String(remoteRelease)); Transport transport = mTempTransport; - mTempTransport = null; + mTempTransport.stop(); int sdk = Build.VERSION.SDK_INT; String release = Build.VERSION.RELEASE; - if (remoteSdk == NON_ANDROID) { + if (Build.isDebuggable()) { + // Debug builds cannot pass attestation verification. Use hardcoded key instead. + Slog.d(TAG, "Creating an unauthenticated secure channel"); + final byte[] testKey = "CDM".getBytes(StandardCharsets.UTF_8); + transport = new SecureTransport(transport.getAssociationId(), transport.getFd(), + mContext, testKey, null); + } else if (remoteSdk == NON_ANDROID) { // TODO: pass in a real preSharedKey transport = new SecureTransport(transport.getAssociationId(), transport.getFd(), - mContext, null, null); - } else if (sdk < SECURE_CHANNEL_AVAILABLE_SDK - || remoteSdk < SECURE_CHANNEL_AVAILABLE_SDK) { - // TODO: depending on the release version, either - // 1) using a RawTransport for old T versions - // 2) or an Ukey2 handshaked transport for UKey2 backported T versions - } else { + mContext, new byte[0], null); + } else if (sdk >= SECURE_CHANNEL_AVAILABLE_SDK + && remoteSdk >= SECURE_CHANNEL_AVAILABLE_SDK) { Slog.i(TAG, "Creating a secure channel"); transport = new SecureTransport(transport.getAssociationId(), transport.getFd(), mContext); - addMessageListenersToTransport(transport); - transport.start(); + } else { + // TODO: depending on the release version, either + // 1) using a RawTransport for old T versions + // 2) or an Ukey2 handshaked transport for UKey2 backported T versions } + addMessageListenersToTransport(transport); + transport.start(); mTransports.put(transport.getAssociationId(), transport); // Doesn't need to notifyTransportsChanged here, it'll be done in attachSystemDataTransport } diff --git a/services/companion/java/com/android/server/companion/transport/RawTransport.java b/services/companion/java/com/android/server/companion/transport/RawTransport.java index 4060f6efe0ca..41589018b149 100644 --- a/services/companion/java/com/android/server/companion/transport/RawTransport.java +++ b/services/companion/java/com/android/server/companion/transport/RawTransport.java @@ -36,6 +36,9 @@ class RawTransport extends Transport { @Override public void start() { + if (DEBUG) { + Slog.d(TAG, "Starting raw transport."); + } new Thread(() -> { try { while (!mStopped) { @@ -44,7 +47,7 @@ class RawTransport extends Transport { } catch (IOException e) { if (!mStopped) { Slog.w(TAG, "Trouble during transport", e); - stop(); + close(); } } }).start(); @@ -52,8 +55,19 @@ class RawTransport extends Transport { @Override public void stop() { + if (DEBUG) { + Slog.d(TAG, "Stopping raw transport."); + } mStopped = true; + } + @Override + public void close() { + stop(); + + if (DEBUG) { + Slog.d(TAG, "Closing raw transport."); + } IoUtils.closeQuietly(mRemoteIn); IoUtils.closeQuietly(mRemoteOut); } @@ -79,15 +93,17 @@ class RawTransport extends Transport { } private void receiveMessage() throws IOException { - final byte[] headerBytes = new byte[HEADER_LENGTH]; - Streams.readFully(mRemoteIn, headerBytes); - final ByteBuffer header = ByteBuffer.wrap(headerBytes); - final int message = header.getInt(); - final int sequence = header.getInt(); - final int length = header.getInt(); - final byte[] data = new byte[length]; - Streams.readFully(mRemoteIn, data); + synchronized (mRemoteIn) { + final byte[] headerBytes = new byte[HEADER_LENGTH]; + Streams.readFully(mRemoteIn, headerBytes); + final ByteBuffer header = ByteBuffer.wrap(headerBytes); + final int message = header.getInt(); + final int sequence = header.getInt(); + final int length = header.getInt(); + final byte[] data = new byte[length]; + Streams.readFully(mRemoteIn, data); - handleMessage(message, sequence, data); + handleMessage(message, sequence, data); + } } } diff --git a/services/companion/java/com/android/server/companion/transport/SecureTransport.java b/services/companion/java/com/android/server/companion/transport/SecureTransport.java index cca08435c0a5..4054fc95f04a 100644 --- a/services/companion/java/com/android/server/companion/transport/SecureTransport.java +++ b/services/companion/java/com/android/server/companion/transport/SecureTransport.java @@ -21,6 +21,7 @@ import android.content.Context; import android.os.ParcelFileDescriptor; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.server.companion.securechannel.AttestationVerifier; import com.android.server.companion.securechannel.SecureChannel; @@ -35,6 +36,7 @@ class SecureTransport extends Transport implements SecureChannel.Callback { private volatile boolean mShouldProcessRequests = false; + @GuardedBy("mRequestQueue") private final BlockingQueue<byte[]> mRequestQueue = new ArrayBlockingQueue<>(100); SecureTransport(int associationId, ParcelFileDescriptor fd, Context context) { @@ -60,6 +62,12 @@ class SecureTransport extends Transport implements SecureChannel.Callback { } @Override + public void close() { + mSecureChannel.close(); + mShouldProcessRequests = false; + } + + @Override public Future<byte[]> requestForResponse(int message, byte[] data) { // Check if channel is secured and start securing if (!mShouldProcessRequests) { @@ -85,12 +93,14 @@ class SecureTransport extends Transport implements SecureChannel.Callback { } // Queue up a message to send - mRequestQueue.add(ByteBuffer.allocate(HEADER_LENGTH + data.length) - .putInt(message) - .putInt(sequence) - .putInt(data.length) - .put(data) - .array()); + synchronized (mRequestQueue) { + mRequestQueue.add(ByteBuffer.allocate(HEADER_LENGTH + data.length) + .putInt(message) + .putInt(sequence) + .putInt(data.length) + .put(data) + .array()); + } } @Override @@ -102,9 +112,11 @@ class SecureTransport extends Transport implements SecureChannel.Callback { new Thread(() -> { try { while (mShouldProcessRequests) { - byte[] request = mRequestQueue.poll(); - if (request != null) { - mSecureChannel.sendSecureMessage(request); + synchronized (mRequestQueue) { + byte[] request = mRequestQueue.poll(); + if (request != null) { + mSecureChannel.sendSecureMessage(request); + } } } } catch (IOException e) { diff --git a/services/companion/java/com/android/server/companion/transport/Transport.java b/services/companion/java/com/android/server/companion/transport/Transport.java index d69ce8909c74..d30104a095cf 100644 --- a/services/companion/java/com/android/server/companion/transport/Transport.java +++ b/services/companion/java/com/android/server/companion/transport/Transport.java @@ -110,13 +110,26 @@ public abstract class Transport { return mFd; } + /** + * Start listening to messages. + */ public abstract void start(); + + /** + * Soft stop listening to the incoming data without closing the streams. + */ public abstract void stop(); + + /** + * Stop listening to the incoming data and close the streams. + */ + public abstract void close(); + protected abstract void sendMessage(int message, int sequence, @NonNull byte[] data) throws IOException; /** - * Send a message + * Send a message. */ public void sendMessage(int message, @NonNull byte[] data) throws IOException { sendMessage(message, mNextSequence.incrementAndGet(), data); @@ -170,7 +183,11 @@ public abstract class Transport { sendMessage(MESSAGE_RESPONSE_SUCCESS, sequence, data); break; } - case MESSAGE_REQUEST_PLATFORM_INFO: + case MESSAGE_REQUEST_PLATFORM_INFO: { + callback(message, data); + // DO NOT SEND A RESPONSE! + break; + } case MESSAGE_REQUEST_CONTEXT_SYNC: { callback(message, data); sendMessage(MESSAGE_RESPONSE_SUCCESS, sequence, EmptyArray.BYTE); diff --git a/services/companion/java/com/android/server/companion/virtual/SensorController.java b/services/companion/java/com/android/server/companion/virtual/SensorController.java index 7df0d861dc22..6d198de98490 100644 --- a/services/companion/java/com/android/server/companion/virtual/SensorController.java +++ b/services/companion/java/com/android/server/companion/virtual/SensorController.java @@ -104,8 +104,9 @@ public class SensorController { } final int handle = mSensorManagerInternal.createRuntimeSensor(mVirtualDeviceId, config.getType(), config.getName(), - config.getVendor() == null ? "" : config.getVendor(), config.getFlags(), - mRuntimeSensorCallback); + config.getVendor() == null ? "" : config.getVendor(), config.getMaximumRange(), + config.getResolution(), config.getPower(), config.getMinDelay(), + config.getMaxDelay(), config.getFlags(), mRuntimeSensorCallback); if (handle <= 0) { throw new SensorCreationException("Received an invalid virtual sensor handle."); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 415c859f734d..65c4d7581b4b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -182,6 +182,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.PermissionMethod; import android.annotation.PermissionName; +import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityClient; @@ -7925,10 +7926,15 @@ public class ActivityManagerService extends IActivityManager.Stub * * @param callback remote callback object to be registered */ + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + @Override public void registerUidFrozenStateChangedCallback( @NonNull IUidFrozenStateChangedCallback callback) { + enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, + "registerUidFrozenStateChangedCallback()"); + Preconditions.checkNotNull(callback, "callback cannot be null"); synchronized (mUidFrozenStateChangedCallbackList) { - boolean registered = mUidFrozenStateChangedCallbackList.register(callback); + final boolean registered = mUidFrozenStateChangedCallbackList.register(callback); if (!registered) { Slog.w(TAG, "Failed to register with RemoteCallbackList!"); } @@ -7940,8 +7946,13 @@ public class ActivityManagerService extends IActivityManager.Stub * * @param callback remote callback object to be unregistered */ + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + @Override public void unregisterUidFrozenStateChangedCallback( @NonNull IUidFrozenStateChangedCallback callback) { + enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, + "unregisterUidFrozenStateChangedCallback()"); + Preconditions.checkNotNull(callback, "callback cannot be null"); synchronized (mUidFrozenStateChangedCallbackList) { mUidFrozenStateChangedCallbackList.unregister(callback); } @@ -8826,7 +8837,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { AppGlobals.getPackageManager().setComponentEnabledSetting(cName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, - UserHandle.USER_SYSTEM); + UserHandle.USER_SYSTEM, "am"); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 7c84b7230816..d9ba8453fffa 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -66,6 +66,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; +import android.os.Trace; import android.os.UserHandle; import android.os.WakeLockStats; import android.os.WorkSource; @@ -140,6 +141,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub BatteryStatsImpl.EnergyStatsRetriever, Watchdog.Monitor { static final String TAG = "BatteryStatsService"; + static final String TRACE_TRACK_WAKEUP_REASON = "wakeup_reason"; static final boolean DBG = false; private static final boolean BATTERY_USAGE_STORE_ENABLED = true; @@ -2482,6 +2484,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub while ((reason = waitWakeup()) != null) { final long nowElapsed = SystemClock.elapsedRealtime(); final long nowUptime = SystemClock.uptimeMillis(); + + Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_REASON, + nowElapsed + " " + reason); + // Wait for the completion of pending works if there is any awaitCompletion(); mCpuWakeupStats.noteWakeupTimeAndReason(nowElapsed, nowUptime, reason); diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 2617fb74cbb3..b293bcf0e17d 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -941,11 +941,14 @@ public final class CachedAppOptimizer { FileReader fr = null; try { - fr = new FileReader(getFreezerCheckPath()); + String path = getFreezerCheckPath(); + Slog.d(TAG_AM, "Checking cgroup freezer: " + path); + fr = new FileReader(path); char state = (char) fr.read(); if (state == '1' || state == '0') { // Also check freezer binder ioctl + Slog.d(TAG_AM, "Checking binder freezer ioctl"); getBinderFreezeInfo(Process.myPid()); supported = true; } else { @@ -967,6 +970,7 @@ public final class CachedAppOptimizer { } } + Slog.d(TAG_AM, "Freezer supported: " + supported); return supported; } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index a944f6fe8b7e..7a92434a4ba4 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2048,8 +2048,9 @@ public class OomAdjuster { // around switching between two apps. However, we don't want to keep the // process in this privileged state indefinitely. Eventually, allow the // app to be demoted to cached. - if ((state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY - && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) < now)) { + if (procState >= PROCESS_STATE_LAST_ACTIVITY + && state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY + && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) < now) { procState = PROCESS_STATE_LAST_ACTIVITY; schedGroup = SCHED_GROUP_BACKGROUND; state.setAdjType("previous-expired"); diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index fc22935736a3..965a07b51e12 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -157,10 +157,10 @@ import com.android.server.LockGuard; import com.android.server.SystemServerInitThreadPool; import com.android.server.SystemServiceManager; import com.android.server.pm.PackageList; +import com.android.server.pm.PackageManagerLocal; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; -import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedAttribution; import com.android.server.policy.AppOpsPolicy; @@ -367,6 +367,9 @@ public class AppOpsService extends IAppOpsService.Stub { /** Package Manager internal. Access via {@link #getPackageManagerInternal()} */ private @Nullable PackageManagerInternal mPackageManagerInternal; + /** Package Manager local. Access via {@link #getPackageManagerLocal()} */ + private @Nullable PackageManagerLocal mPackageManagerLocal; + /** User Manager internal. Access via {@link #getUserManagerInternal()} */ private @Nullable UserManagerInternal mUserManagerInternal; @@ -1189,42 +1192,64 @@ public class AppOpsService extends IAppOpsService.Stub { /** * Initialize uid state objects for state contained in the checking service. */ - private void initializeUidStates() { + @VisibleForTesting + void initializeUidStates() { UserManagerInternal umi = getUserManagerInternal(); - int[] userIds = umi.getUserIds(); synchronized (this) { - for (int i = 0; i < userIds.length; i++) { - int userId = userIds[i]; - initializeUserUidStatesLocked(userId); + int[] userIds = umi.getUserIds(); + try (PackageManagerLocal.UnfilteredSnapshot snapshot = + getPackageManagerLocal().withUnfilteredSnapshot()) { + Map<String, PackageState> packageStates = snapshot.getPackageStates(); + for (int i = 0; i < userIds.length; i++) { + int userId = userIds[i]; + initializeUserUidStatesLocked(userId, packageStates); + } } } } private void initializeUserUidStates(int userId) { synchronized (this) { - initializeUserUidStatesLocked(userId); + try (PackageManagerLocal.UnfilteredSnapshot snapshot = + getPackageManagerLocal().withUnfilteredSnapshot()) { + initializeUserUidStatesLocked(userId, snapshot.getPackageStates()); + } } } - private void initializeUserUidStatesLocked(int userId) { - ArrayMap<String, ? extends PackageStateInternal> packageStates = - getPackageManagerInternal().getPackageStates(); - for (int j = 0; j < packageStates.size(); j++) { - PackageStateInternal packageState = packageStates.valueAt(j); - int uid = UserHandle.getUid(userId, packageState.getAppId()); - UidState uidState = getUidStateLocked(uid, true); - String packageName = packageStates.keyAt(j); - Ops ops = new Ops(packageName, uidState); + private void initializeUserUidStatesLocked(int userId, Map<String, + PackageState> packageStates) { + for (Map.Entry<String, PackageState> entry : packageStates.entrySet()) { + int appId = entry.getValue().getAppId(); + String packageName = entry.getKey(); + + initializePackageUidStateLocked(userId, appId, packageName); + } + } + + /* + Be careful not to clear any existing data; only want to add objects that don't already exist. + */ + private void initializePackageUidStateLocked(int userId, int appId, String packageName) { + int uid = UserHandle.getUid(userId, appId); + UidState uidState = getUidStateLocked(uid, true); + Ops ops = uidState.pkgOps.get(packageName); + if (ops == null) { + ops = new Ops(packageName, uidState); uidState.pkgOps.put(packageName, ops); + } + + SparseIntArray packageModes = + mAppOpsCheckingService.getNonDefaultPackageModes(packageName, userId); + for (int k = 0; k < packageModes.size(); k++) { + int code = packageModes.keyAt(k); - SparseIntArray packageModes = - mAppOpsCheckingService.getNonDefaultPackageModes(packageName, userId); - for (int k = 0; k < packageModes.size(); k++) { - int code = packageModes.get(k); + if (ops.indexOfKey(code) < 0) { ops.put(code, new Op(uidState, packageName, code, uid)); } - uidState.evalForegroundOps(); } + + uidState.evalForegroundOps(); } /** @@ -3649,6 +3674,20 @@ public class AppOpsService extends IAppOpsService.Stub { } /** + * @return {@link PackageManagerLocal} + */ + private @NonNull PackageManagerLocal getPackageManagerLocal() { + if (mPackageManagerLocal == null) { + mPackageManagerLocal = LocalManagerRegistry.getManager(PackageManagerLocal.class); + } + if (mPackageManagerLocal == null) { + throw new IllegalStateException("PackageManagerLocal not loaded"); + } + + return mPackageManagerLocal; + } + + /** * @return {@link UserManagerInternal} */ private @NonNull UserManagerInternal getUserManagerInternal() { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 16bf355f0634..5893f1efc505 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -16,6 +16,7 @@ package com.android.server.audio; +import static android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED; import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK; import static android.app.BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT; import static android.media.AudioManager.RINGER_MODE_NORMAL; @@ -313,7 +314,7 @@ public class AudioService extends IAudioService.Stub * volumes will be updated in case of a change. * @param alias if true, STREAM_NOTIFICATION is aliased to STREAM_RING */ - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void setNotifAliasRingForTest(boolean alias) { super.setNotifAliasRingForTest_enforcePermission(); boolean update = (mNotifAliasRing != alias); @@ -3867,7 +3868,7 @@ public class AudioService extends IAudioService.Stub @Override @android.annotation.EnforcePermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, + MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.MODIFY_AUDIO_ROUTING }) /** @see AudioManager#setVolumeGroupVolumeIndex(int, int, int) */ @@ -3914,7 +3915,7 @@ public class AudioService extends IAudioService.Stub @Override @android.annotation.EnforcePermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, + MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.MODIFY_AUDIO_ROUTING }) /** @see AudioManager#getVolumeGroupVolumeIndex(int) */ @@ -3933,7 +3934,7 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#getVolumeGroupMaxVolumeIndex(int) */ @android.annotation.EnforcePermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, + MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.MODIFY_AUDIO_ROUTING }) public int getVolumeGroupMaxVolumeIndex(int groupId) { @@ -3949,7 +3950,7 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#getVolumeGroupMinVolumeIndex(int) */ @android.annotation.EnforcePermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED, + MODIFY_AUDIO_SETTINGS_PRIVILEGED, android.Manifest.permission.MODIFY_AUDIO_ROUTING }) public int getVolumeGroupMinVolumeIndex(int groupId) { @@ -5075,7 +5076,7 @@ public class AudioService extends IAudioService.Stub * @see AudioManager#addOnStreamAliasingChangedListener(Executor, Runnable) * @see AudioManager#removeOnStreamAliasingChangedListener(Runnable) */ - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void registerStreamAliasingDispatcher(IStreamAliasingDispatcher isad, boolean register) { super.registerStreamAliasingDispatcher_enforcePermission(); Objects.requireNonNull(isad); @@ -5103,7 +5104,7 @@ public class AudioService extends IAudioService.Stub * @see AudioManager#getIndependentStreamTypes() * @return the list of non-aliased stream types */ - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public ArrayList<Integer> getIndependentStreamTypes() { super.getIndependentStreamTypes_enforcePermission(); @@ -5125,7 +5126,7 @@ public class AudioService extends IAudioService.Stub * @param sourceStreamType the stream type for which the alias is queried * @return the stream alias */ - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public @AudioManager.PublicStreamTypes int getStreamTypeAlias(@AudioManager.PublicStreamTypes int sourceStreamType) { super.getStreamTypeAlias_enforcePermission(); @@ -5140,7 +5141,7 @@ public class AudioService extends IAudioService.Stub * @return true when volume control is performed through volume groups, false if it uses * stream types. */ - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public boolean isVolumeControlUsingVolumeGroups() { super.isVolumeControlUsingVolumeGroups_enforcePermission(); @@ -10528,49 +10529,53 @@ public class AudioService extends IAudioService.Stub } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public float getOutputRs2UpperBound() { super.getOutputRs2UpperBound_enforcePermission(); return mSoundDoseHelper.getOutputRs2UpperBound(); } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void setOutputRs2UpperBound(float rs2Value) { super.setOutputRs2UpperBound_enforcePermission(); mSoundDoseHelper.setOutputRs2UpperBound(rs2Value); } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public float getCsd() { super.getCsd_enforcePermission(); return mSoundDoseHelper.getCsd(); } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void setCsd(float csd) { super.setCsd_enforcePermission(); - mSoundDoseHelper.setCsd(csd); + if (csd < 0.0f) { + mSoundDoseHelper.resetCsdTimeouts(); + } else { + mSoundDoseHelper.setCsd(csd); + } } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void forceUseFrameworkMel(boolean useFrameworkMel) { super.forceUseFrameworkMel_enforcePermission(); mSoundDoseHelper.forceUseFrameworkMel(useFrameworkMel); } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public void forceComputeCsdOnAllDevices(boolean computeCsdOnAllDevices) { super.forceComputeCsdOnAllDevices_enforcePermission(); mSoundDoseHelper.forceComputeCsdOnAllDevices(computeCsdOnAllDevices); } @Override - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) public boolean isCsdEnabled() { super.isCsdEnabled_enforcePermission(); return mSoundDoseHelper.isCsdEnabled(); diff --git a/services/core/java/com/android/server/audio/SoundDoseHelper.java b/services/core/java/com/android/server/audio/SoundDoseHelper.java index 7f7c13898219..31f0c0514a8b 100644 --- a/services/core/java/com/android/server/audio/SoundDoseHelper.java +++ b/services/core/java/com/android/server/audio/SoundDoseHelper.java @@ -21,6 +21,8 @@ import static com.android.server.audio.AudioService.MIN_STREAM_VOLUME; import static com.android.server.audio.AudioService.MSG_SET_DEVICE_VOLUME; import static com.android.server.audio.AudioService.SAFE_MEDIA_VOLUME_MSG_START; +import static java.lang.Math.floor; + import android.annotation.NonNull; import android.app.AlarmManager; import android.app.PendingIntent; @@ -94,6 +96,8 @@ public class SoundDoseHelper { private static final int MOMENTARY_EXPOSURE_TIMEOUT_MS = (20 * 3600 * 1000); // 20 hours + private static final int MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED = -1; + // 30s after boot completed private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; @@ -147,6 +151,9 @@ public class SoundDoseHelper { */ private final SparseIntArray mSafeMediaVolumeDevices = new SparseIntArray(); + /** Used for testing to enforce safe media on all devices */ + private boolean mForceSafeMediaOnAllDevices = false; + // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled. // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled // automatically. mMusicActiveMs is rounded to a multiple of MUSIC_ACTIVE_POLL_PERIOD_MS. @@ -170,7 +177,7 @@ public class SoundDoseHelper { private float mCurrentCsd = 0.f; @GuardedBy("mCsdStateLock") - private long mLastMomentaryExposureTimeMs = -1; + private long mLastMomentaryExposureTimeMs = MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED; // dose at which the next dose reached warning occurs @GuardedBy("mCsdStateLock") @@ -364,6 +371,7 @@ public class SoundDoseHelper { SoundDoseRecord[] doseRecordsArray; synchronized (mCsdStateLock) { mCurrentCsd = csd; + mNextCsdWarning = (float) floor(csd + 1.0); mDoseRecords.clear(); @@ -389,6 +397,22 @@ public class SoundDoseHelper { } } + void resetCsdTimeouts() { + if (!mEnableCsd) { + return; + } + + synchronized (mSafeMediaVolumeStateLock) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; + mMusicActiveMs = 0; + saveMusicActiveMs(); + } + + synchronized (mCsdStateLock) { + mLastMomentaryExposureTimeMs = MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED; + } + } + void forceUseFrameworkMel(boolean useFrameworkMel) { if (!mEnableCsd) { return; @@ -423,10 +447,27 @@ public class SoundDoseHelper { } catch (RemoteException e) { Log.e(TAG, "Exception while forcing CSD computation on all devices", e); } + + mForceSafeMediaOnAllDevices = computeCsdOnAllDevices; } boolean isCsdEnabled() { - return mEnableCsd; + if (!mEnableCsd) { + return false; + } + + final ISoundDose soundDose = mSoundDose.get(); + if (soundDose == null) { + Log.w(TAG, "Sound dose interface not initialized"); + return false; + } + + try { + return soundDose.isSoundDoseHalSupported(); + } catch (RemoteException e) { + Log.e(TAG, "Exception while forcing CSD computation on all devices", e); + } + return false; } /*package*/ int safeMediaVolumeIndex(int device) { @@ -490,7 +531,7 @@ public class SoundDoseHelper { private boolean checkSafeMediaVolume_l(int streamType, int index, int device) { return (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) - && safeDevicesContains(device) + && (safeDevicesContains(device) || mForceSafeMediaOnAllDevices) && (index > safeMediaVolumeIndex(device)); } diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContext.java b/services/core/java/com/android/server/biometrics/log/BiometricContext.java index 9199acb0db82..79ce6b48e2e7 100644 --- a/services/core/java/com/android/server/biometrics/log/BiometricContext.java +++ b/services/core/java/com/android/server/biometrics/log/BiometricContext.java @@ -19,6 +19,7 @@ package com.android.server.biometrics.log; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; +import android.hardware.biometrics.AuthenticateOptions; import android.hardware.biometrics.common.OperationContext; import android.view.Surface; @@ -70,6 +71,10 @@ public interface BiometricContext { @Surface.Rotation int getCurrentRotation(); + /** Current display state. */ + @AuthenticateOptions.DisplayState + int getDisplayState(); + /** * Subscribe to context changes. * diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java index b63e8e31f73f..dea8030fe6f8 100644 --- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java +++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java @@ -23,14 +23,13 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.hardware.biometrics.AuthenticateOptions; import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.common.OperationContext; -import android.hardware.display.AmbientDisplayConfiguration; import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; -import android.os.UserHandle; import android.util.Slog; import android.view.Display; import android.view.WindowManager; @@ -65,7 +64,6 @@ public final class BiometricContextProvider implements BiometricContext { try { sInstance = new BiometricContextProvider(context, (WindowManager) context.getSystemService(Context.WINDOW_SERVICE), - new AmbientDisplayConfiguration(context), IStatusBarService.Stub.asInterface(ServiceManager.getServiceOrThrow( Context.STATUS_BAR_SERVICE)), null /* handler */, new AuthSessionCoordinator()); @@ -83,8 +81,6 @@ public final class BiometricContextProvider implements BiometricContext { @Nullable private final Map<Integer, BiometricContextSessionInfo> mSession = new ConcurrentHashMap<>(); - - private final AmbientDisplayConfiguration mAmbientDisplayConfiguration; private final AuthSessionCoordinator mAuthSessionCoordinator; private final WindowManager mWindowManager; @Nullable private final Handler mHandler; @@ -93,6 +89,7 @@ public final class BiometricContextProvider implements BiometricContext { private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; private int mFoldState = IBiometricContextListener.FoldState.UNKNOWN; + private int mDisplayState = AuthenticateOptions.DISPLAY_STATE_UNKNOWN; @VisibleForTesting final BroadcastReceiver mDockStateReceiver = new BroadcastReceiver() { @Override @@ -106,11 +103,9 @@ public final class BiometricContextProvider implements BiometricContext { @VisibleForTesting public BiometricContextProvider(@NonNull Context context, @NonNull WindowManager windowManager, - @NonNull AmbientDisplayConfiguration ambientDisplayConfiguration, @NonNull IStatusBarService service, @Nullable Handler handler, @NonNull AuthSessionCoordinator authSessionCoordinator) { mWindowManager = windowManager; - mAmbientDisplayConfiguration = ambientDisplayConfiguration; mAuthSessionCoordinator = authSessionCoordinator; mHandler = handler; @@ -122,11 +117,10 @@ public final class BiometricContextProvider implements BiometricContext { try { service.setBiometicContextListener(new IBiometricContextListener.Stub() { @Override - public void onDozeChanged(boolean isDozing, boolean isAwake) { - isDozing = isDozing && isAodEnabled(); - final boolean changed = (mIsAod != isDozing) || (mIsAwake != isAwake); + public void onDozeChanged(boolean isAod, boolean isAwake) { + final boolean changed = (mIsAod != isAod) || (mIsAwake != isAwake); if (changed) { - mIsAod = isDozing; + mIsAod = isAod; mIsAwake = isAwake; notifyChanged(); } @@ -138,8 +132,12 @@ public final class BiometricContextProvider implements BiometricContext { // no need to notify, not sent to HAL } - private boolean isAodEnabled() { - return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT); + @Override + public void onDisplayStateChanged(int displayState) { + if (displayState != mDisplayState) { + mDisplayState = displayState; + notifyChanged(); + } } }); service.registerSessionListener(SESSION_TYPES, new ISessionListener.Stub() { @@ -216,6 +214,11 @@ public final class BiometricContextProvider implements BiometricContext { } @Override + public int getDisplayState() { + return mDisplayState; + } + + @Override public void subscribe(@NonNull OperationContextExt context, @NonNull Consumer<OperationContext> consumer) { mSubscribers.put(context, consumer); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 1e9352d10956..b25206d3b621 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -271,6 +271,13 @@ public class Vpn { static final int DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT = 5 * 60; /** + * Default keepalive value to consider long-lived TCP connections are expensive on the + * VPN network from battery usage point of view. + * TODO: consider reading from setting. + */ + @VisibleForTesting + static final int DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC = 60; + /** * Prefer using {@link IkeSessionParams.ESP_IP_VERSION_AUTO} and * {@link IkeSessionParams.ESP_ENCAP_TYPE_AUTO} for ESP packets. * @@ -358,9 +365,8 @@ public class Vpn { return mVpnProfileStore; } - private static final int MAX_EVENTS_LOGS = 20; - private final LocalLog mUnderlyNetworkChanges = new LocalLog(MAX_EVENTS_LOGS); - private final LocalLog mVpnManagerEvents = new LocalLog(MAX_EVENTS_LOGS); + private static final int MAX_EVENTS_LOGS = 100; + private final LocalLog mEventChanges = new LocalLog(MAX_EVENTS_LOGS); /** * Cached Map of <subscription ID, CarrierConfigInfo> since retrieving the PersistableBundle @@ -950,7 +956,7 @@ public class Vpn { int errorCode, @NonNull final String packageName, @Nullable final String sessionKey, @NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork, @Nullable final NetworkCapabilities nc, @Nullable final LinkProperties lp) { - mVpnManagerEvents.log("Event class=" + getVpnManagerEventClassName(errorClass) + mEventChanges.log("[VMEvent] Event class=" + getVpnManagerEventClassName(errorClass) + ", err=" + getVpnManagerEventErrorName(errorCode) + " for " + packageName + " on session " + sessionKey); final Intent intent = buildVpnManagerEventIntent(category, errorClass, errorCode, @@ -1100,6 +1106,8 @@ public class Vpn { mLockdownAllowlist = (mLockdown && lockdownAllowlist != null) ? Collections.unmodifiableList(new ArrayList<>(lockdownAllowlist)) : Collections.emptyList(); + mEventChanges.log("[LockdownAlwaysOn] Mode changed: lockdown=" + mLockdown + " alwaysOn=" + + mAlwaysOn + " calling from " + Binder.getCallingUid()); if (isCurrentPreparedPackage(packageName)) { updateAlwaysOnNotification(mNetworkInfo.getDetailedState()); @@ -1670,9 +1678,12 @@ public class Vpn { capsBuilder.setUids(createUserAndRestrictedProfilesRanges(mUserId, mConfig.allowedApplications, mConfig.disallowedApplications)); - capsBuilder.setTransportInfo( - new VpnTransportInfo(getActiveVpnType(), mConfig.session, mConfig.allowBypass, - false /* longLivedTcpConnectionsExpensive */)); + final boolean expensive = areLongLivedTcpConnectionsExpensive(mVpnRunner); + capsBuilder.setTransportInfo(new VpnTransportInfo( + getActiveVpnType(), + mConfig.session, + mConfig.allowBypass, + expensive)); // Only apps targeting Q and above can explicitly declare themselves as metered. // These VPNs are assumed metered unless they state otherwise. @@ -1704,6 +1715,17 @@ public class Vpn { updateState(DetailedState.CONNECTED, "agentConnect"); } + private static boolean areLongLivedTcpConnectionsExpensive(@NonNull VpnRunner runner) { + if (!(runner instanceof IkeV2VpnRunner)) return false; + + final int delay = ((IkeV2VpnRunner) runner).getOrGuessKeepaliveDelaySeconds(); + return areLongLivedTcpConnectionsExpensive(delay); + } + + private static boolean areLongLivedTcpConnectionsExpensive(int keepaliveDelaySec) { + return keepaliveDelaySec < DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC; + } + private boolean canHaveRestrictedProfile(int userId) { final long token = Binder.clearCallingIdentity(); try { @@ -1715,7 +1737,7 @@ public class Vpn { } private void logUnderlyNetworkChanges(List<Network> networks) { - mUnderlyNetworkChanges.log("Switch to " + mEventChanges.log("[UnderlyingNW] Switch to " + ((networks != null) ? TextUtils.join(", ", networks) : "null")); } @@ -2982,16 +3004,17 @@ public class Vpn { @Override public void onCarrierConfigChanged(int slotIndex, int subId, int carrierId, int specificCarrierId) { + mEventChanges.log("[CarrierConfig] Changed on slot " + slotIndex + " subId=" + + subId + " carrerId=" + carrierId + + " specificCarrierId=" + specificCarrierId); synchronized (Vpn.this) { mCachedCarrierConfigInfoPerSubId.remove(subId); // Ignore stale runner. if (mVpnRunner != Vpn.IkeV2VpnRunner.this) return; - maybeMigrateIkeSession(mActiveNetwork); + maybeMigrateIkeSessionAndUpdateVpnTransportInfo(mActiveNetwork); } - // TODO: update the longLivedTcpConnectionsExpensive value in the - // networkcapabilities of the VPN network. } }; @@ -3074,6 +3097,8 @@ public class Vpn { */ public void onIkeOpened(int token, @NonNull IkeSessionConfiguration ikeConfiguration) { if (!isActiveToken(token)) { + mEventChanges.log("[IKEEvent-" + mSessionKey + "] onIkeOpened obsolete token=" + + token); Log.d(TAG, "onIkeOpened called for obsolete token " + token); return; } @@ -3081,7 +3106,12 @@ public class Vpn { mMobikeEnabled = ikeConfiguration.isIkeExtensionEnabled( IkeSessionConfiguration.EXTENSION_TYPE_MOBIKE); - onIkeConnectionInfoChanged(token, ikeConfiguration.getIkeSessionConnectionInfo()); + final IkeSessionConnectionInfo info = ikeConfiguration.getIkeSessionConnectionInfo(); + mEventChanges.log("[IKEEvent-" + mSessionKey + "] onIkeOpened token=" + token + + ", localAddr=" + info.getLocalAddress() + + ", network=" + info.getNetwork() + + ", mobikeEnabled= " + mMobikeEnabled); + onIkeConnectionInfoChanged(token, info); } /** @@ -3094,11 +3124,17 @@ public class Vpn { */ public void onIkeConnectionInfoChanged( int token, @NonNull IkeSessionConnectionInfo ikeConnectionInfo) { + if (!isActiveToken(token)) { + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onIkeConnectionInfoChanged obsolete token=" + token); Log.d(TAG, "onIkeConnectionInfoChanged called for obsolete token " + token); return; } - + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onIkeConnectionInfoChanged token=" + token + + ", localAddr=" + ikeConnectionInfo.getLocalAddress() + + ", network=" + ikeConnectionInfo.getNetwork()); // The update on VPN and the IPsec tunnel will be done when migration is fully complete // in onChildMigrated mIkeConnectionInfo = ikeConnectionInfo; @@ -3112,6 +3148,8 @@ public class Vpn { */ public void onChildOpened(int token, @NonNull ChildSessionConfiguration childConfig) { if (!isActiveToken(token)) { + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onChildOpened obsolete token=" + token); Log.d(TAG, "onChildOpened called for obsolete token " + token); // Do nothing; this signals that either: (1) a new/better Network was found, @@ -3121,7 +3159,9 @@ public class Vpn { // sessions are torn down via resetIkeState(). return; } - + mEventChanges.log("[IKEEvent-" + mSessionKey + "] onChildOpened token=" + token + + ", addr=" + TextUtils.join(", ", childConfig.getInternalAddresses()) + + " dns=" + TextUtils.join(", ", childConfig.getInternalDnsServers())); try { final String interfaceName = mTunnelIface.getInterfaceName(); final List<LinkAddress> internalAddresses = childConfig.getInternalAddresses(); @@ -3218,6 +3258,8 @@ public class Vpn { public void onChildTransformCreated( int token, @NonNull IpSecTransform transform, int direction) { if (!isActiveToken(token)) { + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onChildTransformCreated obsolete token=" + token); Log.d(TAG, "ChildTransformCreated for obsolete token " + token); // Do nothing; this signals that either: (1) a new/better Network was found, @@ -3227,7 +3269,9 @@ public class Vpn { // sessions are torn down via resetIkeState(). return; } - + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onChildTransformCreated token=" + token + ", direction=" + direction + + ", transform=" + transform); try { mTunnelIface.setUnderlyingNetwork(mIkeConnectionInfo.getNetwork()); @@ -3252,10 +3296,14 @@ public class Vpn { @NonNull IpSecTransform inTransform, @NonNull IpSecTransform outTransform) { if (!isActiveToken(token)) { + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onChildMigrated obsolete token=" + token); Log.d(TAG, "onChildMigrated for obsolete token " + token); return; } - + mEventChanges.log("[IKEEvent-" + mSessionKey + + "] onChildMigrated token=" + token + + ", in=" + inTransform + ", out=" + outTransform); // The actual network of this IKE session has migrated to is // mIkeConnectionInfo.getNetwork() instead of mActiveNetwork because mActiveNetwork // might have been updated after the migration was triggered. @@ -3442,7 +3490,7 @@ public class Vpn { return; } - if (maybeMigrateIkeSession(underlyingNetwork)) return; + if (maybeMigrateIkeSessionAndUpdateVpnTransportInfo(underlyingNetwork)) return; startIkeSession(underlyingNetwork); } @@ -3549,7 +3597,43 @@ public class Vpn { return new CarrierConfigInfo(mccMnc, natKeepalive, encapType, ipVersion); } - boolean maybeMigrateIkeSession(@NonNull Network underlyingNetwork) { + private int getOrGuessKeepaliveDelaySeconds() { + if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { + return guessNattKeepaliveTimerForNetwork(); + } else if (mProfile.getIkeTunnelConnectionParams() != null) { + return mProfile.getIkeTunnelConnectionParams() + .getIkeSessionParams().getNattKeepAliveDelaySeconds(); + } + return DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT; + } + + boolean maybeMigrateIkeSessionAndUpdateVpnTransportInfo( + @NonNull Network underlyingNetwork) { + final int keepaliveDelaySec = getOrGuessKeepaliveDelaySeconds(); + final boolean migrated = maybeMigrateIkeSession(underlyingNetwork, keepaliveDelaySec); + if (migrated) { + updateVpnTransportInfoAndNetCap(keepaliveDelaySec); + } + return migrated; + } + + public void updateVpnTransportInfoAndNetCap(int keepaliveDelaySec) { + final VpnTransportInfo info = new VpnTransportInfo( + getActiveVpnType(), + mConfig.session, + mConfig.allowBypass, + areLongLivedTcpConnectionsExpensive(keepaliveDelaySec)); + final boolean ncUpdateRequired = !info.equals(mNetworkCapabilities.getTransportInfo()); + if (ncUpdateRequired) { + mNetworkCapabilities = new NetworkCapabilities.Builder(mNetworkCapabilities) + .setTransportInfo(info) + .build(); + doSendNetworkCapabilities(mNetworkAgent, mNetworkCapabilities); + } + } + + private boolean maybeMigrateIkeSession(@NonNull Network underlyingNetwork, + int keepaliveDelaySeconds) { if (mSession == null || !mMobikeEnabled) return false; // IKE session can schedule a migration event only when IKE AUTH is finished @@ -3574,15 +3658,6 @@ public class Vpn { encapType = ESP_ENCAP_TYPE_AUTO; } - final int keepaliveDelaySeconds; - if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { - keepaliveDelaySeconds = guessNattKeepaliveTimerForNetwork(); - } else if (mProfile.getIkeTunnelConnectionParams() != null) { - keepaliveDelaySeconds = mProfile.getIkeTunnelConnectionParams() - .getIkeSessionParams().getNattKeepAliveDelaySeconds(); - } else { - keepaliveDelaySeconds = DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT; - } mSession.setNetwork(underlyingNetwork, ipVersion, encapType, keepaliveDelaySeconds); return true; } @@ -3656,6 +3731,8 @@ public class Vpn { /** Called when the NetworkCapabilities of underlying network is changed */ public void onDefaultNetworkCapabilitiesChanged(@NonNull NetworkCapabilities nc) { + mEventChanges.log("[UnderlyingNW] Cap changed from " + + mUnderlyingNetworkCapabilities + " to " + nc); final NetworkCapabilities oldNc = mUnderlyingNetworkCapabilities; mUnderlyingNetworkCapabilities = nc; if (oldNc == null) { @@ -3663,12 +3740,14 @@ public class Vpn { startOrMigrateIkeSession(mActiveNetwork); } else if (!nc.getSubscriptionIds().equals(oldNc.getSubscriptionIds())) { // Renew carrierConfig values. - maybeMigrateIkeSession(mActiveNetwork); + maybeMigrateIkeSessionAndUpdateVpnTransportInfo(mActiveNetwork); } } /** Called when the LinkProperties of underlying network is changed */ public void onDefaultNetworkLinkPropertiesChanged(@NonNull LinkProperties lp) { + mEventChanges.log("[UnderlyingNW] Lp changed from " + + mUnderlyingLinkProperties + " to " + lp); mUnderlyingLinkProperties = lp; } @@ -3691,7 +3770,7 @@ public class Vpn { Log.d(TAG, "Data stall suspected"); // Trigger MOBIKE. - maybeMigrateIkeSession(mActiveNetwork); + maybeMigrateIkeSessionAndUpdateVpnTransportInfo(mActiveNetwork); mDataStallSuspected = true; } } @@ -4673,7 +4752,7 @@ public class Vpn { // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from // ConnectivityServiceTest. if (SdkLevel.isAtLeastT()) { - mVpnManagerEvents.log(packageName + " stopped"); + mEventChanges.log("[VMEvent] " + packageName + " stopped"); sendEventToVpnManagerApp(intent, packageName); } } @@ -5007,23 +5086,21 @@ public class Vpn { pw.println("NetworkCapabilities: " + mNetworkCapabilities); if (isIkev2VpnRunner()) { final IkeV2VpnRunner runner = ((IkeV2VpnRunner) mVpnRunner); - pw.println("Token: " + runner.mSessionKey); + pw.println("SessionKey: " + runner.mSessionKey); pw.println("MOBIKE " + (runner.mMobikeEnabled ? "enabled" : "disabled")); + pw.println("Profile: " + runner.mProfile); + pw.println("Token: " + runner.mCurrentToken); if (mDataStallSuspected) pw.println("Data stall suspected"); if (runner.mScheduledHandleDataStallFuture != null) { pw.println("Reset session scheduled"); } } + pw.println(); pw.println("mCachedCarrierConfigInfoPerSubId=" + mCachedCarrierConfigInfoPerSubId); - pw.println("mUnderlyNetworkChanges (most recent first):"); - pw.increaseIndent(); - mUnderlyNetworkChanges.reverseDump(pw); - pw.decreaseIndent(); - - pw.println("mVpnManagerEvent (most recent first):"); + pw.println("mEventChanges (most recent first):"); pw.increaseIndent(); - mVpnManagerEvents.reverseDump(pw); + mEventChanges.reverseDump(pw); pw.decreaseIndent(); } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 720ea99da93d..af5609a68952 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -896,7 +896,7 @@ public class AutomaticBrightnessController { if (mLoggingEnabled) { Slog.d(TAG, "updateAmbientLux: " + ((mFastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": " - + "mBrighteningLuxThreshold=" + mAmbientBrighteningThreshold + ", " + + "mAmbientBrighteningThreshold=" + mAmbientBrighteningThreshold + ", " + "mAmbientDarkeningThreshold=" + mAmbientDarkeningThreshold + ", " + "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " + "mAmbientLux=" + mAmbientLux); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index e01aa9b33784..ea0a4ab56320 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2589,9 +2589,7 @@ public final class DisplayManagerService extends SystemService { void setDisplayModeDirectorLoggingEnabled(boolean enabled) { synchronized (mSyncRoot) { - if (mDisplayModeDirector != null) { - mDisplayModeDirector.setLoggingEnabled(enabled); - } + mDisplayModeDirector.setLoggingEnabled(enabled); } } @@ -2852,8 +2850,11 @@ public final class DisplayManagerService extends SystemService { private void dumpInternal(PrintWriter pw) { pw.println("DISPLAY MANAGER (dumpsys display)"); + BrightnessTracker brightnessTrackerLocal; synchronized (mSyncRoot) { + brightnessTrackerLocal = mBrightnessTracker; + pw.println(" mSafeMode=" + mSafeMode); pw.println(" mPendingTraversal=" + mPendingTraversal); pw.println(" mViewports=" + mViewports); @@ -2926,10 +2927,6 @@ public final class DisplayManagerService extends SystemService { for (int i = 0; i < displayPowerControllerCount; i++) { mDisplayPowerControllers.valueAt(i).dump(pw); } - if (mBrightnessTracker != null) { - pw.println(); - mBrightnessTracker.dump(pw); - } pw.println(); mPersistentDataStore.dump(pw); @@ -2942,6 +2939,10 @@ public final class DisplayManagerService extends SystemService { mDisplayWindowPolicyControllers.valueAt(i).second.dump(" ", pw); } } + if (brightnessTrackerLocal != null) { + pw.println(); + brightnessTrackerLocal.dump(pw); + } pw.println(); mDisplayModeDirector.dump(pw); mBrightnessSynchronizer.dump(pw); diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java index 13e29a38efce..01892945ed17 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -2643,7 +2643,15 @@ public class DisplayModeDirector { public void observe() { StatusBarManagerInternal statusBar = LocalServices.getService(StatusBarManagerInternal.class); - if (statusBar != null) { + if (statusBar == null) { + return; + } + + // Allow UDFPS vote by registering callback, only + // if the device is configured to not ignore UDFPS vote. + boolean ignoreUdfpsVote = mContext.getResources() + .getBoolean(R.bool.config_ignoreUdfpsVote); + if (!ignoreUdfpsVote) { statusBar.setUdfpsRefreshRateCallback(this); } } diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index 20ff51c22783..de10b1b19a33 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -17,6 +17,7 @@ package com.android.server.dreams; import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM; +import static android.content.Intent.FLAG_RECEIVER_FOREGROUND; import android.app.ActivityTaskManager; import android.app.BroadcastOptions; @@ -63,20 +64,25 @@ final class DreamController { // Time to allow the dream to perform an exit transition when waking up. private static final int DREAM_FINISH_TIMEOUT = 5 * 1000; + // Extras used with ACTION_CLOSE_SYSTEM_DIALOGS broadcast + private static final String EXTRA_REASON_KEY = "reason"; + private static final String EXTRA_REASON_VALUE = "dream"; + private final Context mContext; private final Handler mHandler; private final Listener mListener; private final ActivityTaskManager mActivityTaskManager; private final Intent mDreamingStartedIntent = new Intent(Intent.ACTION_DREAMING_STARTED) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | FLAG_RECEIVER_FOREGROUND); private final Intent mDreamingStoppedIntent = new Intent(Intent.ACTION_DREAMING_STOPPED) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | FLAG_RECEIVER_FOREGROUND); private static final String DREAMING_DELIVERY_GROUP_NAMESPACE = UUID.randomUUID().toString(); private static final String DREAMING_DELIVERY_GROUP_KEY = UUID.randomUUID().toString(); private final Bundle mDreamingStartedStoppedOptions = createDreamingStartedStoppedOptions(); private final Intent mCloseNotificationShadeIntent; + private final Bundle mCloseNotificationShadeOptions; private DreamRecord mCurrentDream; @@ -96,7 +102,14 @@ final class DreamController { mListener = listener; mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class); mCloseNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - mCloseNotificationShadeIntent.putExtra("reason", "dream"); + mCloseNotificationShadeIntent.putExtra(EXTRA_REASON_KEY, EXTRA_REASON_VALUE); + mCloseNotificationShadeIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + mCloseNotificationShadeOptions = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeliveryGroupMatchingKey(Intent.ACTION_CLOSE_SYSTEM_DIALOGS, + EXTRA_REASON_VALUE) + .setDeferralPolicy(BroadcastOptions.DEFERRAL_POLICY_UNTIL_ACTIVE) + .toBundle(); } /** @@ -149,7 +162,8 @@ final class DreamController { Trace.traceBegin(Trace.TRACE_TAG_POWER, "startDream"); try { // Close the notification shade. No need to send to all, but better to be explicit. - mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL); + mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL, + null /* receiverPermission */, mCloseNotificationShadeOptions); Slog.i(TAG, "Starting dream: name=" + name + ", isPreviewMode=" + isPreviewMode + ", canDoze=" + canDoze diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 91f58db407f2..35c70fbce8ad 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -22,6 +22,7 @@ import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.input.InputManager; +import android.hardware.input.InputManagerGlobal; import android.hardware.tv.cec.V1_0.Result; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioManager; @@ -827,7 +828,7 @@ abstract class HdmiCecLocalDevice extends HdmiLocalDevice { KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_HDMI, null); - InputManager.getInstance() + InputManagerGlobal.getInstance() .injectInputEvent(keyEvent, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); keyEvent.recycle(); } diff --git a/services/core/java/com/android/server/input/InputShellCommand.java b/services/core/java/com/android/server/input/InputShellCommand.java index 773dc680d4cb..513259145da0 100644 --- a/services/core/java/com/android/server/input/InputShellCommand.java +++ b/services/core/java/com/android/server/input/InputShellCommand.java @@ -42,6 +42,7 @@ import static android.view.KeyEvent.META_SHIFT_RIGHT_ON; import static java.util.Collections.unmodifiableMap; import android.hardware.input.InputManager; +import android.hardware.input.InputManagerGlobal; import android.os.ShellCommand; import android.os.SystemClock; import android.util.ArrayMap; @@ -109,7 +110,7 @@ public class InputShellCommand extends ShellCommand { } private void injectKeyEvent(KeyEvent event) { - InputManager.getInstance().injectInputEvent(event, + InputManagerGlobal.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } @@ -178,7 +179,7 @@ public class InputShellCommand extends ShellCommand { pointerProperties, pointerCoords, DEFAULT_META_STATE, DEFAULT_BUTTON_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, getInputDeviceId(inputSource), DEFAULT_EDGE_FLAGS, inputSource, displayId, DEFAULT_FLAGS); - InputManager.getInstance().injectInputEvent(event, + InputManagerGlobal.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } @@ -530,7 +531,7 @@ public class InputShellCommand extends ShellCommand { } private void injectKeyEventAsync(KeyEvent event) { - InputManager.getInstance().injectInputEvent(event, + InputManagerGlobal.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } diff --git a/services/core/java/com/android/server/input/KeyboardBacklightController.java b/services/core/java/com/android/server/input/KeyboardBacklightController.java index e1e3dd9967e0..403323803fca 100644 --- a/services/core/java/com/android/server/input/KeyboardBacklightController.java +++ b/services/core/java/com/android/server/input/KeyboardBacklightController.java @@ -344,7 +344,7 @@ final class KeyboardBacklightController implements throw new IllegalStateException("The calling process has no registered " + "KeyboardBacklightListener."); } - if (record.mListener != listener) { + if (record.mListener.asBinder() != listener.asBinder()) { throw new IllegalStateException("The calling process has a different registered " + "KeyboardBacklightListener."); } diff --git a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java index eb4dba63dea9..502855defa07 100644 --- a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java +++ b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java @@ -25,6 +25,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.UiThread; import android.hardware.input.InputManager; +import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.text.TextUtils; @@ -55,17 +56,20 @@ final class HandwritingModeController { public static final String TAG = HandwritingModeController.class.getSimpleName(); // TODO(b/210039666): flip the flag. static final boolean DEBUG = true; + // Use getHandwritingBufferSize() and not this value directly. private static final int EVENT_BUFFER_SIZE = 100; // A longer event buffer used for handwriting delegation // TODO(b/210039666): make this device touch sampling rate dependent. - private static final int LONG_EVENT_BUFFER = EVENT_BUFFER_SIZE * 20; + // Use getHandwritingBufferSize() and not this value directly. + private static final int LONG_EVENT_BUFFER_SIZE = EVENT_BUFFER_SIZE * 20; + private static final long HANDWRITING_DELEGATION_IDLE_TIMEOUT_MS = 3000; // This must be the looper for the UiThread. private final Looper mLooper; private final InputManagerInternal mInputManagerInternal; private final WindowManagerInternal mWindowManagerInternal; - private List<MotionEvent> mHandwritingBuffer; + private ArrayList<MotionEvent> mHandwritingBuffer; private InputEventReceiver mHandwritingEventReceiver; private Runnable mInkWindowInitRunnable; private boolean mRecordingGesture; @@ -73,6 +77,8 @@ final class HandwritingModeController { // when set, package names are used for handwriting delegation. private @Nullable String mDelegatePackageName; private @Nullable String mDelegatorPackageName; + private Runnable mDelegationIdleTimeoutRunnable; + private Handler mDelegationIdleTimeoutHandler; private HandwritingEventReceiverSurface mHandwritingSurface; @@ -110,7 +116,7 @@ final class HandwritingModeController { mCurrentDisplayId = displayId; if (mHandwritingBuffer == null) { - mHandwritingBuffer = new ArrayList<>(EVENT_BUFFER_SIZE); + mHandwritingBuffer = new ArrayList<>(getHandwritingBufferSize()); } if (DEBUG) Slog.d(TAG, "Initializing handwriting spy monitor for display: " + displayId); @@ -159,8 +165,8 @@ final class HandwritingModeController { @NonNull String delegatePackageName, @NonNull String delegatorPackageName) { mDelegatePackageName = delegatePackageName; mDelegatorPackageName = delegatorPackageName; - ((ArrayList) mHandwritingBuffer).ensureCapacity(LONG_EVENT_BUFFER); - // TODO(b/210039666): cancel delegation after a timeout or next input method client binding. + mHandwritingBuffer.ensureCapacity(getHandwritingBufferSize()); + scheduleHandwritingDelegationTimeout(); } @Nullable String getDelegatePackageName() { @@ -171,6 +177,32 @@ final class HandwritingModeController { return mDelegatorPackageName; } + private void scheduleHandwritingDelegationTimeout() { + if (mDelegationIdleTimeoutHandler == null) { + mDelegationIdleTimeoutHandler = new Handler(mLooper); + } else { + mDelegationIdleTimeoutHandler.removeCallbacks(mDelegationIdleTimeoutRunnable); + } + mDelegationIdleTimeoutRunnable = () -> { + Slog.d(TAG, "Stylus handwriting delegation idle timed-out."); + clearPendingHandwritingDelegation(); + if (mHandwritingBuffer != null) { + mHandwritingBuffer.forEach(MotionEvent::recycle); + mHandwritingBuffer.clear(); + mHandwritingBuffer.trimToSize(); + mHandwritingBuffer.ensureCapacity(getHandwritingBufferSize()); + } + }; + mDelegationIdleTimeoutHandler.postDelayed( + mDelegationIdleTimeoutRunnable, HANDWRITING_DELEGATION_IDLE_TIMEOUT_MS); + } + + private int getHandwritingBufferSize() { + if (mDelegatePackageName != null && mDelegatorPackageName != null) { + return LONG_EVENT_BUFFER_SIZE; + } + return EVENT_BUFFER_SIZE; + } /** * Clear any pending handwriting delegation info. */ @@ -178,6 +210,11 @@ final class HandwritingModeController { if (DEBUG) { Slog.d(TAG, "clearPendingHandwritingDelegation"); } + if (mDelegationIdleTimeoutHandler != null) { + mDelegationIdleTimeoutHandler.removeCallbacks(mDelegationIdleTimeoutRunnable); + mDelegationIdleTimeoutHandler = null; + } + mDelegationIdleTimeoutRunnable = null; mDelegatorPackageName = null; mDelegatePackageName = null; } @@ -322,7 +359,7 @@ final class HandwritingModeController { return; } - if (mHandwritingBuffer.size() >= EVENT_BUFFER_SIZE) { + if (mHandwritingBuffer.size() >= getHandwritingBufferSize()) { if (DEBUG) { Slog.w(TAG, "Current gesture exceeds the buffer capacity." + " The rest of the gesture will not be recorded."); diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index 991930fd049f..ec03d9d43539 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -65,6 +65,7 @@ import com.android.server.LocalServices; import com.android.server.integrity.engine.RuleEvaluationEngine; import com.android.server.integrity.model.IntegrityCheckResult; import com.android.server.integrity.model.RuleMetadata; +import com.android.server.pm.PackageManagerServiceUtils; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; @@ -383,7 +384,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { private String getInstallerPackageName(Intent intent) { String installer = intent.getStringExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_PACKAGE); - if (installer == null) { + if (PackageManagerServiceUtils.isInstalledByAdb(installer)) { return ADB_INSTALLER; } int installerUid = intent.getIntExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_UID, -1); diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 1cc958b0f529..115421db4d31 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -44,6 +44,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.PendingIntent; import android.app.compat.CompatChanges; @@ -770,6 +771,12 @@ public class LocationManagerService extends ILocationManager.Stub implements public void registerLocationListener(String provider, LocationRequest request, ILocationListener listener, String packageName, @Nullable String attributionTag, String listenerId) { + ActivityManagerInternal managerInternal = + LocalServices.getService(ActivityManagerInternal.class); + if (managerInternal != null) { + managerInternal.logFgsApiBegin(ActivityManager.FOREGROUND_SERVICE_API_TYPE_LOCATION, + Binder.getCallingUid(), Binder.getCallingPid()); + } CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, attributionTag, listenerId); int permissionLevel = LocationPermissions.getPermissionLevel(mContext, identity.getUid(), @@ -927,6 +934,12 @@ public class LocationManagerService extends ILocationManager.Stub implements @Override public void unregisterLocationListener(ILocationListener listener) { + ActivityManagerInternal managerInternal = + LocalServices.getService(ActivityManagerInternal.class); + if (managerInternal != null) { + managerInternal.logFgsApiEnd(ActivityManager.FOREGROUND_SERVICE_API_TYPE_LOCATION, + Binder.getCallingUid(), Binder.getCallingPid()); + } for (LocationProviderManager manager : mProviderManagers) { manager.unregisterLocationRequest(listener); } diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 27744626385e..827704159628 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -1258,17 +1258,18 @@ public class ZenModeHelper { .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true) .writeByteArray(config.toZenPolicy().toProto()); events.add(data.build()); - if (config.manualRule != null && config.manualRule.enabler != null) { - ruleToProtoLocked(user, config.manualRule, events); + if (config.manualRule != null) { + ruleToProtoLocked(user, config.manualRule, true, events); } for (ZenRule rule : config.automaticRules.values()) { - ruleToProtoLocked(user, rule, events); + ruleToProtoLocked(user, rule, false, events); } } } } - private void ruleToProtoLocked(int user, ZenRule rule, List<StatsEvent> events) { + private void ruleToProtoLocked(int user, ZenRule rule, boolean isManualRule, + List<StatsEvent> events) { // Make the ID safe. String id = rule.id == null ? "" : rule.id; if (!ZenModeConfig.DEFAULT_RULE_IDS.contains(id)) { @@ -1279,6 +1280,9 @@ public class ZenModeHelper { String pkg = rule.getPkg() == null ? "" : rule.getPkg(); if (rule.enabler != null) { pkg = rule.enabler; + } + + if (isManualRule) { id = ZenModeConfig.MANUAL_RULE_ID; } diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index 9e93fe04d112..2e1c72e66e55 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -47,7 +47,6 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.incremental.IncrementalManager; import android.os.incremental.IncrementalStorage; -import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Pair; @@ -424,7 +423,7 @@ public class ApkChecksums { @Nullable Certificate[] trustedInstallers, Map<Integer, ApkChecksum> checksums, @NonNull Injector injector) { - if (TextUtils.isEmpty(installerPackageName)) { + if (PackageManagerServiceUtils.isInstalledByAdb(installerPackageName)) { return; } if (trustedInstallers != null && trustedInstallers.length == 0) { diff --git a/services/core/java/com/android/server/pm/BackgroundInstallControlService.java b/services/core/java/com/android/server/pm/BackgroundInstallControlService.java index 8d40adfb29f0..0bb05aab4394 100644 --- a/services/core/java/com/android/server/pm/BackgroundInstallControlService.java +++ b/services/core/java/com/android/server/pm/BackgroundInstallControlService.java @@ -248,7 +248,7 @@ public class BackgroundInstallControlService extends SystemService { // ADB sets installerPackageName to null, this creates a loophole to bypass BIC which will be // addressed with b/265203007 private boolean installedByAdb(String initiatingPackageName) { - return initiatingPackageName == null; + return PackageManagerServiceUtils.isInstalledByAdb(initiatingPackageName); } private boolean wasForegroundInstallation(String installerPackageName, diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 3ac7aa750bf9..5f424edb15c4 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -90,6 +90,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.comparePackageSig import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists; import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride; +import static com.android.server.pm.PackageManagerServiceUtils.isInstalledByAdb; import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive; import static com.android.server.pm.SharedUidMigration.BEST_EFFORT; @@ -333,7 +334,7 @@ final class InstallPackageHelper { if (installSource != null) { // If this is part of a standard install, set the initiating package name, else rely on // previous device state. - if (installSource.mInitiatingPackageName != null) { + if (!isInstalledByAdb(installSource.mInitiatingPackageName)) { final PackageSetting ips = mPm.mSettings.getPackageLPr( installSource.mInitiatingPackageName); if (ips != null) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index adc0b0b6fc6a..69e92e075b51 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -19,6 +19,8 @@ package com.android.server.pm; import static android.app.admin.DevicePolicyResources.Strings.Core.PACKAGE_DELETED_BY_DO; import static android.os.Process.INVALID_UID; +import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME; + import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -679,7 +681,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags |= PackageManager.INSTALL_FROM_ADB; // adb installs can override the installingPackageName, but not the // initiatingPackageName - installerPackageName = null; + installerPackageName = SHELL_PACKAGE_NAME; } else { if (callingUid != Process.SYSTEM_UID) { // The supplied installerPackageName must always belong to the calling app. diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 36aeca142f5c..ea6383e14969 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -51,6 +51,7 @@ import static com.android.internal.util.XmlUtils.writeStringAttribute; import static com.android.internal.util.XmlUtils.writeUriAttribute; import static com.android.server.pm.PackageInstallerService.prepareStageDir; import static com.android.server.pm.PackageManagerService.APP_METADATA_FILE_NAME; +import static com.android.server.pm.PackageManagerServiceUtils.isInstalledByAdb; import android.Manifest; import android.annotation.AnyThread; @@ -1395,9 +1396,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } + final String initiatingPackageName = getInstallSource().mInitiatingPackageName; final String installerPackageName; - if (!TextUtils.isEmpty(getInstallSource().mInitiatingPackageName)) { - installerPackageName = getInstallSource().mInitiatingPackageName; + if (!isInstalledByAdb(initiatingPackageName)) { + installerPackageName = initiatingPackageName; } else { installerPackageName = getInstallSource().mInstallerPackageName; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a6faff85ab06..2038e798a038 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -43,6 +43,7 @@ import static com.android.server.pm.DexOptHelper.useArtService; import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet; import static com.android.server.pm.InstructionSets.getPreferredInstructionSet; import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; +import static com.android.server.pm.PackageManagerServiceUtils.isInstalledByAdb; import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; import android.Manifest; @@ -351,6 +352,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService static final boolean DEBUG_ABI_SELECTION = false; public static final boolean DEBUG_INSTANT = Build.IS_DEBUGGABLE; + static final String SHELL_PACKAGE_NAME = "com.android.shell"; + static final boolean HIDE_EPHEMERAL_APIS = false; static final String PRECOMPILE_LAYOUTS = "pm.precompile_layouts"; @@ -1330,10 +1333,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName, userId); + final String initiatingPackageName = installSourceInfo.getInitiatingPackageName(); final String installerPackageName; if (installSourceInfo != null) { - if (!TextUtils.isEmpty(installSourceInfo.getInitiatingPackageName())) { - installerPackageName = installSourceInfo.getInitiatingPackageName(); + if (!isInstalledByAdb(initiatingPackageName)) { + installerPackageName = initiatingPackageName; } else { installerPackageName = installSourceInfo.getInstallingPackageName(); } @@ -3775,7 +3779,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } private void setEnabledSettings(List<ComponentEnabledSetting> settings, int userId, - String callingPackage) { + @NonNull String callingPackage) { final int callingUid = Binder.getCallingUid(); // TODO: This method is not properly snapshotified beyond this call final Computer preLockSnapshot = snapshotComputer(); @@ -4047,11 +4051,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService boolean success = false; if (!setting.isComponent()) { // We're dealing with an application/package level state change - if (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT - || newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { - // Don't care about who enables an app. - callingPackage = null; - } pkgSetting.setEnabled(newState, userId, callingPackage); if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER || newState == COMPONENT_ENABLED_STATE_DISABLED) @@ -5810,21 +5809,28 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void setComponentEnabledSetting(ComponentName componentName, - int newState, int flags, int userId) { + int newState, int flags, int userId, String callingPackage) { if (!mUserManager.exists(userId)) return; + if (callingPackage == null) { + callingPackage = Integer.toString(Binder.getCallingUid()); + } setEnabledSettings(List.of(new PackageManager.ComponentEnabledSetting(componentName, newState, flags)), - userId, null /* callingPackage */); + userId, callingPackage); } @Override - public void setComponentEnabledSettings(List<PackageManager.ComponentEnabledSetting> settings, int userId) { + public void setComponentEnabledSettings( + List<PackageManager.ComponentEnabledSetting> settings, int userId, + String callingPackage) { if (!mUserManager.exists(userId)) return; if (settings == null || settings.isEmpty()) { throw new IllegalArgumentException("The list of enabled settings is empty"); } - - setEnabledSettings(settings, userId, null /* callingPackage */); + if (callingPackage == null) { + callingPackage = Integer.toString(Binder.getCallingUid()); + } + setEnabledSettings(settings, userId, callingPackage); } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 3f9a0bc89641..77e4688cecb5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -32,6 +32,7 @@ import static com.android.server.pm.PackageManagerService.DEBUG_INTENT_MATCHING; import static com.android.server.pm.PackageManagerService.DEBUG_PREFERRED; import static com.android.server.pm.PackageManagerService.RANDOM_CODEPATH_PREFIX; import static com.android.server.pm.PackageManagerService.RANDOM_DIR_PREFIX; +import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME; import static com.android.server.pm.PackageManagerService.STUB_SUFFIX; import static com.android.server.pm.PackageManagerService.TAG; @@ -1516,4 +1517,11 @@ public class PackageManagerServiceUtils { } } } + + /** + * Check if package name is com.android.shell or is null. + */ + public static boolean isInstalledByAdb(String initiatingPackageName) { + return initiatingPackageName == null || SHELL_PACKAGE_NAME.equals(initiatingPackageName); + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 232ca45cb4aa..cc60802967b0 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2447,7 +2447,7 @@ class PackageManagerShellCommand extends ShellCommand { mInterface.getApplicationEnabledSetting(pkg, translatedUserId))); return 0; } else { - mInterface.setComponentEnabledSetting(cn, state, 0, translatedUserId); + mInterface.setComponentEnabledSetting(cn, state, 0, translatedUserId, "shell"); getOutPrintWriter().println("Component " + cn.toShortString() + " new state: " + enabledSettingToString( mInterface.getComponentEnabledSetting(cn, translatedUserId))); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 94a00d6e2e48..02d13bcbb8ae 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3947,14 +3947,15 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED); if (enabledStr != null) { try { - packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */, null); + packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */, + "settings"); } catch (NumberFormatException e) { if (enabledStr.equalsIgnoreCase("true")) { - packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0, null); + packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0, "settings"); } else if (enabledStr.equalsIgnoreCase("false")) { - packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, null); + packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, "settings"); } else if (enabledStr.equalsIgnoreCase("default")) { - packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null); + packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, "settings"); } else { PackageManagerService.reportSettingsProblem(Log.WARN, "Error in package manager settings: package " + name @@ -3963,7 +3964,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } } } else { - packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null); + packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, "settings"); } addInstallerPackageNames(installSource); diff --git a/services/core/java/com/android/server/power/stats/CpuWakeupStats.java b/services/core/java/com/android/server/power/stats/CpuWakeupStats.java index b05b662dc1e8..d55fbc27e109 100644 --- a/services/core/java/com/android/server/power/stats/CpuWakeupStats.java +++ b/services/core/java/com/android/server/power/stats/CpuWakeupStats.java @@ -23,6 +23,7 @@ import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_WIFI; import android.content.Context; import android.os.Handler; import android.os.HandlerExecutor; +import android.os.Trace; import android.os.UserHandle; import android.provider.DeviceConfig; import android.util.IndentingPrintWriter; @@ -55,6 +56,7 @@ public class CpuWakeupStats { private static final String SUBSYSTEM_ALARM_STRING = "Alarm"; private static final String SUBSYSTEM_ALARM_WIFI = "Wifi"; + private static final String TRACE_TRACK_WAKEUP_ATTRIBUTION = "wakeup_attribution"; @VisibleForTesting static final long WAKEUP_REASON_HALF_WINDOW_MS = 500; private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.MINUTES.toMillis(2); @@ -94,13 +96,15 @@ public class CpuWakeupStats { return FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN; } - private synchronized void logWakeupToStatsLog(Wakeup wakeupToLog) { + private synchronized void logWakeupAttribution(Wakeup wakeupToLog) { if (ArrayUtils.isEmpty(wakeupToLog.mDevices)) { FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED, FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__TYPE__TYPE_UNKNOWN, FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN, null, wakeupToLog.mElapsedMillis); + Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_ATTRIBUTION, + wakeupToLog.mElapsedMillis + " --"); return; } @@ -112,6 +116,9 @@ public class CpuWakeupStats { Slog.wtf(TAG, "Unexpected null attribution found for " + wakeupToLog); return; } + + final StringBuilder traceEventBuilder = new StringBuilder(); + for (int i = 0; i < wakeupAttribution.size(); i++) { final int subsystem = wakeupAttribution.keyAt(i); final SparseBooleanArray uidMap = wakeupAttribution.valueAt(i); @@ -132,7 +139,19 @@ public class CpuWakeupStats { subsystemToStatsReason(subsystem), uids, wakeupToLog.mElapsedMillis); + + if (Trace.isTagEnabled(Trace.TRACE_TAG_POWER)) { + if (i == 0) { + traceEventBuilder.append(wakeupToLog.mElapsedMillis + " "); + } + traceEventBuilder.append((subsystemToString(subsystem))); + traceEventBuilder.append(":"); + traceEventBuilder.append(Arrays.toString(uids)); + traceEventBuilder.append(" "); + } } + Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_ATTRIBUTION, + traceEventBuilder.toString().trim()); } /** Notes a wakeup reason as reported by SuspendControlService to battery stats. */ @@ -160,7 +179,7 @@ public class CpuWakeupStats { for (int i = lastIdx; i >= 0; i--) { mWakeupAttribution.removeAt(i); } - mHandler.postDelayed(() -> logWakeupToStatsLog(parsedWakeup), WAKEUP_WRITE_DELAY_MS); + mHandler.postDelayed(() -> logWakeupAttribution(parsedWakeup), WAKEUP_WRITE_DELAY_MS); } /** Notes a waking activity that could have potentially woken up the CPU. */ diff --git a/services/core/java/com/android/server/sensors/SensorManagerInternal.java b/services/core/java/com/android/server/sensors/SensorManagerInternal.java index 6c32ec2e8df8..7ff4ade1101c 100644 --- a/services/core/java/com/android/server/sensors/SensorManagerInternal.java +++ b/services/core/java/com/android/server/sensors/SensorManagerInternal.java @@ -60,7 +60,8 @@ public abstract class SensorManagerInternal { * @return The sensor handle. */ public abstract int createRuntimeSensor(int deviceId, int type, @NonNull String name, - @NonNull String vendor, int flags, @NonNull RuntimeSensorCallback callback); + @NonNull String vendor, float maximumRange, float resolution, float power, + int minDelay, int maxDelay, int flags, @NonNull RuntimeSensorCallback callback); /** * Unregisters the sensor with the given handle from the framework. diff --git a/services/core/java/com/android/server/sensors/SensorService.java b/services/core/java/com/android/server/sensors/SensorService.java index 1baa0a6d79a1..3de191030d71 100644 --- a/services/core/java/com/android/server/sensors/SensorService.java +++ b/services/core/java/com/android/server/sensors/SensorService.java @@ -56,7 +56,8 @@ public class SensorService extends SystemService { private static native void unregisterProximityActiveListenerNative(long ptr); private static native int registerRuntimeSensorNative(long ptr, int deviceId, int type, - String name, String vendor, int flags, + String name, String vendor, float maximumRange, float resolution, float power, + int minDelay, int maxDelay, int flags, SensorManagerInternal.RuntimeSensorCallback callback); private static native void unregisterRuntimeSensorNative(long ptr, int handle); private static native boolean sendRuntimeSensorEventNative(long ptr, int handle, int type, @@ -96,10 +97,11 @@ public class SensorService extends SystemService { class LocalService extends SensorManagerInternal { @Override public int createRuntimeSensor(int deviceId, int type, @NonNull String name, - @NonNull String vendor, int flags, @NonNull RuntimeSensorCallback callback) { + @NonNull String vendor, float maximumRange, float resolution, float power, + int minDelay, int maxDelay, int flags, @NonNull RuntimeSensorCallback callback) { synchronized (mLock) { - int handle = registerRuntimeSensorNative(mPtr, deviceId, type, name, vendor, flags, - callback); + int handle = registerRuntimeSensorNative(mPtr, deviceId, type, name, vendor, + maximumRange, resolution, power, minDelay, maxDelay, flags, callback); mRuntimeSensorHandles.add(handle); return handle; } diff --git a/services/core/java/com/android/server/timedetector/ServerFlags.java b/services/core/java/com/android/server/timedetector/ServerFlags.java index 28d34c26e0dd..2049a0288f5a 100644 --- a/services/core/java/com/android/server/timedetector/ServerFlags.java +++ b/services/core/java/com/android/server/timedetector/ServerFlags.java @@ -69,6 +69,7 @@ public final class ServerFlags { KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT, KEY_TIME_DETECTOR_LOWER_BOUND_MILLIS_OVERRIDE, KEY_TIME_DETECTOR_ORIGIN_PRIORITIES_OVERRIDE, + KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT, KEY_TIME_ZONE_DETECTOR_TELEPHONY_FALLBACK_SUPPORTED, KEY_ENHANCED_METRICS_COLLECTION_ENABLED, }) @@ -154,6 +155,14 @@ public final class ServerFlags { "location_time_zone_detection_setting_enabled_default"; /** + * The key to alter a device's "automatic time zone detection enabled" setting default value. + * This flag is only intended for internal testing. + */ + public static final @DeviceConfigKey String + KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT = + "time_zone_detector_auto_detection_enabled_default"; + + /** * The key to control support for time zone detection falling back to telephony detection under * certain circumstances. */ diff --git a/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java b/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java index 6ebaf14c28db..a71f9c7f9086 100644 --- a/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java +++ b/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessorImpl.java @@ -64,6 +64,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { ServerFlags.KEY_ENHANCED_METRICS_COLLECTION_ENABLED, ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT, ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE, + ServerFlags.KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT, ServerFlags.KEY_TIME_ZONE_DETECTOR_TELEPHONY_FALLBACK_SUPPORTED ); @@ -174,7 +175,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { } }, filter, null, null /* main thread */); - // Add async callbacks for global settings being changed. + // Add async callbacks for changes to global settings that influence behavior. ContentResolver contentResolver = mContext.getContentResolver(); ContentObserver contentObserver = new ContentObserver(mContext.getMainThreadHandler()) { @Override @@ -184,6 +185,9 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { }; contentResolver.registerContentObserver( Settings.Global.getUriFor(Settings.Global.AUTO_TIME_ZONE), true, contentObserver); + contentResolver.registerContentObserver( + Settings.Global.getUriFor(Settings.Global.AUTO_TIME_ZONE_EXPLICIT), true, + contentObserver); // Add async callbacks for user scoped location settings being changed. contentResolver.registerContentObserver( @@ -239,8 +243,9 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { @Override public synchronized boolean updateConfiguration(@UserIdInt int userId, - @NonNull TimeZoneConfiguration requestedConfiguration, boolean bypassUserPolicyChecks) { - Objects.requireNonNull(requestedConfiguration); + @NonNull TimeZoneConfiguration requestedConfigurationUpdates, + boolean bypassUserPolicyChecks) { + Objects.requireNonNull(requestedConfigurationUpdates); ConfigurationInternal configurationInternal = getConfigurationInternal(userId); TimeZoneCapabilities capabilities = @@ -248,7 +253,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { TimeZoneConfiguration oldConfiguration = configurationInternal.asConfiguration(); final TimeZoneConfiguration newConfiguration = - capabilities.tryApplyConfigChanges(oldConfiguration, requestedConfiguration); + capabilities.tryApplyConfigChanges(oldConfiguration, requestedConfigurationUpdates); if (newConfiguration == null) { // The changes could not be made because the user's capabilities do not allow it. return false; @@ -256,7 +261,7 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { // Store the configuration / notify as needed. This will cause the mEnvironment to invoke // handleConfigChanged() asynchronously. - storeConfiguration(userId, newConfiguration); + storeConfiguration(userId, requestedConfigurationUpdates, newConfiguration); return true; } @@ -268,15 +273,20 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { */ @GuardedBy("this") private void storeConfiguration(@UserIdInt int userId, - @NonNull TimeZoneConfiguration configuration) { - Objects.requireNonNull(configuration); + @NonNull TimeZoneConfiguration requestedConfigurationUpdates, + @NonNull TimeZoneConfiguration newConfiguration) { + Objects.requireNonNull(newConfiguration); // Avoid writing the auto detection enabled setting for devices that do not support auto // time zone detection: if we wrote it down then we'd set the value explicitly, which would // prevent detecting "default" later. That might influence what happens on later releases // that support new types of auto detection on the same hardware. if (isAutoDetectionFeatureSupported()) { - final boolean autoDetectionEnabled = configuration.isAutoDetectionEnabled(); + if (requestedConfigurationUpdates.hasIsAutoDetectionEnabled()) { + // Record that the auto detection enabled setting has now been set explicitly. + Settings.Global.putInt(mCr, Settings.Global.AUTO_TIME_ZONE_EXPLICIT, 1); + } + final boolean autoDetectionEnabled = newConfiguration.isAutoDetectionEnabled(); setAutoDetectionEnabledIfRequired(autoDetectionEnabled); // Only write the geo detection enabled setting when its values is used, e.g.: @@ -288,10 +298,10 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { // Not being able to detect if the user has actually expressed a preference could // influence what happens on later releases that start to support geo detection on the // user's same hardware. - if (!getGeoDetectionSettingEnabledOverride().isPresent() + if (getGeoDetectionSettingEnabledOverride().isEmpty() && isGeoTimeZoneDetectionFeatureSupported() && isTelephonyTimeZoneDetectionFeatureSupported()) { - final boolean geoDetectionEnabledSetting = configuration.isGeoDetectionEnabled(); + final boolean geoDetectionEnabledSetting = newConfiguration.isGeoDetectionEnabled(); setGeoDetectionEnabledSettingIfRequired(userId, geoDetectionEnabledSetting); } } @@ -335,7 +345,31 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor { } private boolean getAutoDetectionEnabledSetting() { - return Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME_ZONE, 1 /* default */) > 0; + boolean autoDetectionEnabledSetting = + Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME_ZONE, 1 /* default */) > 0; + + Optional<Boolean> optionalFlagValue = mServerFlags.getOptionalBoolean( + ServerFlags.KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT); + if (optionalFlagValue.isPresent()) { + // This branch is rare: it is expected to happen only for internal testers. + + if (Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME_ZONE_EXPLICIT, 0) == 0) { + // The device hasn't explicitly had the auto detection enabled setting updated via a + // call to storeConfiguration(). This means the device is allowed to use a server + // flag to determine the default. + boolean flagValue = optionalFlagValue.get(); + + // Best effort to keep the setting in sync with the flag in case something is + // observing the (public API) Settings.Global.AUTO_TIME_ZONE directly. This change + // will cause listeners to fire asynchronously but any cascade should stop after one + // round. + if (flagValue != autoDetectionEnabledSetting) { + Settings.Global.putInt(mCr, Settings.Global.AUTO_TIME_ZONE, flagValue ? 1 : 0); + } + autoDetectionEnabledSetting = flagValue; + } + } + return autoDetectionEnabledSetting; } private boolean getGeoDetectionEnabledSetting(@UserIdInt int userId) { diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java index ab68e834d337..d1ddb581c029 100644 --- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java +++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java @@ -37,6 +37,7 @@ import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_RUN_IN_BACKGROUND_ENABLED; import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT; import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE; +import static com.android.server.timedetector.ServerFlags.KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT; import static com.android.server.timedetector.ServerFlags.KEY_TIME_ZONE_DETECTOR_TELEPHONY_FALLBACK_SUPPORTED; import android.app.time.LocationTimeZoneManager; @@ -308,6 +309,10 @@ class TimeZoneDetectorShellCommand extends ShellCommand { pw.printf(" %s\n", KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE); pw.printf(" Used to override the device's 'geolocation time zone detection enabled'" + " setting [*].\n"); + pw.printf(" %s\n", KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT); + pw.printf(" Used to set the automatic time zone detection enabled default, i.e. when the" + + " device's automatic time zone detection enabled setting hasn't been set" + + " explicitly. Intended for internal testers."); pw.printf(" %s\n", KEY_TIME_ZONE_DETECTOR_TELEPHONY_FALLBACK_SUPPORTED); pw.printf(" Used to enable / disable support for telephony detection fallback. Also see" + " the %s command.\n", SHELL_COMMAND_ENABLE_TELEPHONY_FALLBACK); diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index ad789d830c39..fd203bbfe3b5 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -815,8 +815,8 @@ public final class TvInputManagerService extends SystemService { } @GuardedBy("mLock") - private boolean createSessionInternalLocked(ITvInputService service, IBinder sessionToken, - int userId, AttributionSource tvAppAttributionSource) { + private boolean createSessionInternalLocked( + ITvInputService service, IBinder sessionToken, int userId) { UserState userState = getOrCreateUserStateLocked(userId); SessionState sessionState = userState.sessionStateMap.get(sessionToken); if (DEBUG) { @@ -836,7 +836,7 @@ public final class TvInputManagerService extends SystemService { callback, sessionState.inputId, sessionState.sessionId); } else { service.createSession(channels[1], callback, sessionState.inputId, - sessionState.sessionId, tvAppAttributionSource); + sessionState.sessionId, sessionState.tvAppAttributionSource); } } catch (RemoteException e) { Slog.e(TAG, "error in createSession", e); @@ -1547,7 +1547,7 @@ public final class TvInputManagerService extends SystemService { IBinder sessionToken = new Binder(); SessionState sessionState = new SessionState(sessionToken, info.getId(), info.getComponent(), isRecordingSession, client, seq, callingUid, - callingPid, resolvedUserId, uniqueSessionId); + callingPid, resolvedUserId, uniqueSessionId, tvAppAttributionSource); // Add them to the global session state map of the current user. userState.sessionStateMap.put(sessionToken, sessionState); @@ -1559,8 +1559,8 @@ public final class TvInputManagerService extends SystemService { serviceState.sessionTokens.add(sessionToken); if (serviceState.service != null) { - if (!createSessionInternalLocked(serviceState.service, sessionToken, - resolvedUserId, tvAppAttributionSource)) { + if (!createSessionInternalLocked( + serviceState.service, sessionToken, resolvedUserId)) { removeSessionStateLocked(sessionToken, resolvedUserId); } } else { @@ -3135,6 +3135,7 @@ public final class TvInputManagerService extends SystemService { private final ComponentName componentName; private final boolean isRecordingSession; private final ITvInputClient client; + private final AttributionSource tvAppAttributionSource; private final int seq; /** * The {code UID} of the application that created the session. @@ -3163,7 +3164,8 @@ public final class TvInputManagerService extends SystemService { private SessionState(IBinder sessionToken, String inputId, ComponentName componentName, boolean isRecordingSession, ITvInputClient client, int seq, int callingUid, - int callingPid, int userId, String sessionId) { + int callingPid, int userId, String sessionId, + AttributionSource tvAppAttributionSource) { this.sessionToken = sessionToken; this.inputId = inputId; this.componentName = componentName; @@ -3174,6 +3176,7 @@ public final class TvInputManagerService extends SystemService { this.callingPid = callingPid; this.userId = userId; this.sessionId = sessionId; + this.tvAppAttributionSource = tvAppAttributionSource; } @Override @@ -3223,8 +3226,7 @@ public final class TvInputManagerService extends SystemService { // And create sessions, if any. for (IBinder sessionToken : serviceState.sessionTokens) { - if (!createSessionInternalLocked( - serviceState.service, sessionToken, mUserId, null)) { + if (!createSessionInternalLocked(serviceState.service, sessionToken, mUserId)) { tokensToBeRemoved.add(sessionToken); } } diff --git a/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java b/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java index 0d4a76ee3add..fb400da4503e 100644 --- a/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java +++ b/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java @@ -2887,7 +2887,7 @@ public class TvInteractiveAppManagerService extends SystemService { } @Override - public void onRequestScheduleRecording2(String inputId, String requestId, Uri channelUri, + public void onRequestScheduleRecording2(String requestId, String inputId, Uri channelUri, long start, long duration, int repeat, Bundle params) { synchronized (mLock) { if (DEBUG) { diff --git a/services/core/java/com/android/server/vcn/TEST_MAPPING b/services/core/java/com/android/server/vcn/TEST_MAPPING new file mode 100644 index 000000000000..5b04d884fc1a --- /dev/null +++ b/services/core/java/com/android/server/vcn/TEST_MAPPING @@ -0,0 +1,10 @@ +{ + "presubmit": [ + { + "name": "FrameworksVcnTests" + }, + { + "name": "CtsVcnTestCases" + } + ] +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 38ba7c3b52f3..9069ac50badf 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -100,6 +100,7 @@ import static android.content.res.Configuration.EMPTY; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; +import static android.content.res.Configuration.UI_MODE_TYPE_DESK; import static android.content.res.Configuration.UI_MODE_TYPE_MASK; import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET; import static android.os.Build.VERSION_CODES.HONEYCOMB; @@ -837,6 +838,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** Whether the input to this activity will be dropped during the current playing animation. */ private boolean mIsInputDroppedForAnimation; + /** + * Whether the application has desk mode resources. Calculated and cached when + * {@link #hasDeskResources()} is called. + */ + @Nullable + private Boolean mHasDeskResources; + boolean mHandleExitSplashScreen; @TransferSplashScreenState int mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_IDLE; @@ -3978,6 +3986,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A "Reported destroyed for activity that is not destroying: r=" + this); } + mTaskSupervisor.killTaskProcessesOnDestroyedIfNeeded(task); if (isInRootTaskLocked()) { cleanUp(true /* cleanServices */, false /* setState */); removeFromHistory(reason); @@ -8124,6 +8133,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mSizeCompatScale = 1f; mSizeCompatBounds = null; mCompatDisplayInsets = null; + mLetterboxUiController.clearInheritedCompatDisplayInsets(); } @VisibleForTesting @@ -9058,8 +9068,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } if (activityType != ACTIVITY_TYPE_UNDEFINED && activityType != getActivityType()) { - Slog.w(TAG, "Can't change activity type once set: " + this - + " activityType=" + activityTypeToString(getActivityType())); + final String errorMessage = "Can't change activity type once set: " + this + + " activityType=" + activityTypeToString(getActivityType()) + ", was " + + activityTypeToString(activityType); + if (Build.IS_DEBUGGABLE) { + throw new IllegalStateException(errorMessage); + } + Slog.w(TAG, errorMessage); } // Configuration's equality doesn't consider seq so if only seq number changes in resolved @@ -9546,7 +9561,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A configChanged |= CONFIG_UI_MODE; } - return (changes&(~configChanged)) != 0; + // TODO(b/274944389): remove workaround after long-term solution is implemented + // Don't restart due to desk mode change if the app does not have desk resources. + if (mWmService.mSkipActivityRelaunchWhenDocking && onlyDeskInUiModeChanged(changesConfig) + && !hasDeskResources()) { + configChanged |= CONFIG_UI_MODE; + } + + return (changes & (~configChanged)) != 0; } /** @@ -9559,6 +9581,50 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A != isInVrUiMode(lastReportedConfig)); } + /** + * Returns true if the uiMode configuration changed, and desk mode + * ({@link android.content.res.Configuration#UI_MODE_TYPE_DESK}) was the only change to uiMode. + */ + private boolean onlyDeskInUiModeChanged(Configuration lastReportedConfig) { + final Configuration currentConfig = getConfiguration(); + + boolean deskModeChanged = isInDeskUiMode(currentConfig) != isInDeskUiMode( + lastReportedConfig); + // UI mode contains fields other than the UI mode type, so determine if any other fields + // changed. + boolean uiModeOtherFieldsChanged = + (currentConfig.uiMode & ~UI_MODE_TYPE_MASK) != (lastReportedConfig.uiMode + & ~UI_MODE_TYPE_MASK); + + return deskModeChanged && !uiModeOtherFieldsChanged; + } + + /** + * Determines whether or not the application has desk mode resources. + */ + boolean hasDeskResources() { + if (mHasDeskResources != null) { + // We already determined this, return the cached value. + return mHasDeskResources; + } + + mHasDeskResources = false; + try { + Resources packageResources = mAtmService.mContext.createPackageContextAsUser( + packageName, 0, UserHandle.of(mUserId)).getResources(); + for (Configuration sizeConfiguration : + packageResources.getSizeAndUiModeConfigurations()) { + if (isInDeskUiMode(sizeConfiguration)) { + mHasDeskResources = true; + break; + } + } + } catch (PackageManager.NameNotFoundException e) { + Slog.w(TAG, "Exception thrown during checking for desk resources " + this, e); + } + return mHasDeskResources; + } + private int getConfigurationChanges(Configuration lastReportedConfig) { // Determine what has changed. May be nothing, if this is a config that has come back from // the app after going idle. In that case we just want to leave the official config object @@ -9890,6 +9956,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return (config.uiMode & UI_MODE_TYPE_MASK) == UI_MODE_TYPE_VR_HEADSET; } + private static boolean isInDeskUiMode(Configuration config) { + return (config.uiMode & UI_MODE_TYPE_MASK) == UI_MODE_TYPE_DESK; + } + String getProcessName() { return info.applicationInfo.processName; } @@ -10427,6 +10497,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override boolean isSyncFinished() { + if (task != null && mTransitionController.isTransientHide(task)) { + // The activity keeps visibleRequested but may be hidden later, so no need to wait for + // it to be drawn. + return true; + } if (!super.isSyncFinished()) return false; if (mDisplayContent != null && mDisplayContent.mUnknownAppVisibilityController .isVisibilityUnknown(this)) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index eaf55838afe7..be503fc61c4c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -190,12 +190,19 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { /** How long we wait until giving up on the activity telling us it released the top state. */ private static final int TOP_RESUMED_STATE_LOSS_TIMEOUT = 500; + /** + * The timeout to kill task processes if its activity didn't complete destruction in time + * when there is a request to remove the task with killProcess=true. + */ + private static final int KILL_TASK_PROCESSES_TIMEOUT_MS = 1000; + private static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_TASK_MSG; private static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_TASK_MSG + 1; private static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_TASK_MSG + 2; private static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_TASK_MSG + 3; private static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_TASK_MSG + 4; private static final int PROCESS_STOPPING_AND_FINISHING_MSG = FIRST_SUPERVISOR_TASK_MSG + 5; + private static final int KILL_TASK_PROCESSES_TIMEOUT_MSG = FIRST_SUPERVISOR_TASK_MSG + 6; private static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_TASK_MSG + 12; private static final int RESTART_ACTIVITY_PROCESS_TIMEOUT_MSG = FIRST_SUPERVISOR_TASK_MSG + 13; private static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_TASK_MSG + 14; @@ -1642,10 +1649,32 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { return; } task.mTransitionController.requestCloseTransitionIfNeeded(task); + // Consume the stopping activities immediately so activity manager won't skip killing + // the process because it is still foreground state, i.e. RESUMED -> PAUSING set from + // removeActivities -> finishIfPossible. + if (killProcess) { + ArrayList<ActivityRecord> activities = null; + for (int i = mStoppingActivities.size() - 1; i >= 0; i--) { + final ActivityRecord r = mStoppingActivities.get(i); + if (r.getTask() == task) { + if (activities == null) { + activities = new ArrayList<>(); + } + activities.add(r); + mStoppingActivities.remove(i); + } + } + if (activities != null) { + // This can update to background state. + for (int i = activities.size() - 1; i >= 0; i--) { + activities.get(i).stopIfPossible(); + } + } + } task.mInRemoveTask = true; try { task.removeActivities(reason, false /* excludingTaskOverlay */); - cleanUpRemovedTaskLocked(task, killProcess, removeFromRecents); + cleanUpRemovedTask(task, killProcess, removeFromRecents); mService.getLockTaskController().clearLockedTask(task); mService.getTaskChangeNotificationController().notifyTaskStackChanged(); if (task.isPersistable) { @@ -1825,11 +1854,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } } - void cleanUpRemovedTaskLocked(Task task, boolean killProcess, boolean removeFromRecents) { + /** This method should only be called for leaf task. */ + private void cleanUpRemovedTask(Task task, boolean killProcess, boolean removeFromRecents) { if (removeFromRecents) { mRecentTasks.remove(task); } - ComponentName component = task.getBaseIntent().getComponent(); + final Intent baseIntent = task.getBaseIntent(); + final ComponentName component = baseIntent != null ? baseIntent.getComponent() : null; if (component == null) { Slog.w(TAG, "No component for base intent of task: " + task); return; @@ -1837,16 +1868,38 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // Find any running services associated with this app and stop if needed. final Message msg = PooledLambda.obtainMessage(ActivityManagerInternal::cleanUpServices, - mService.mAmInternal, task.mUserId, component, new Intent(task.getBaseIntent())); + mService.mAmInternal, task.mUserId, component, new Intent(baseIntent)); mService.mH.sendMessage(msg); if (!killProcess) { return; } + // Give a chance for the client to handle Activity#onStop(). The timeout waits for + // onDestroy because the client defers to report completion of stopped, the callback from + // DestroyActivityItem may be called first. + final ActivityRecord top = task.getTopMostActivity(); + if (top != null && top.finishing && !top.mAppStopped && top.lastVisibleTime > 0 + && !task.mKillProcessesOnDestroyed) { + task.mKillProcessesOnDestroyed = true; + mHandler.sendMessageDelayed( + mHandler.obtainMessage(KILL_TASK_PROCESSES_TIMEOUT_MSG, task), + KILL_TASK_PROCESSES_TIMEOUT_MS); + return; + } + killTaskProcessesIfPossible(task); + } + + void killTaskProcessesOnDestroyedIfNeeded(Task task) { + if (task == null || !task.mKillProcessesOnDestroyed) return; + mHandler.removeMessages(KILL_TASK_PROCESSES_TIMEOUT_MSG, task); + killTaskProcessesIfPossible(task); + } - // Determine if the process(es) for this task should be killed. - final String pkg = component.getPackageName(); - ArrayList<Object> procsToKill = new ArrayList<>(); + /** Kills the processes in the task if it doesn't contain perceptible components. */ + private void killTaskProcessesIfPossible(Task task) { + task.mKillProcessesOnDestroyed = false; + final String pkg = task.getBasePackageName(); + ArrayList<Object> procsToKill = null; ArrayMap<String, SparseArray<WindowProcessController>> pmap = mService.mProcessNames.getMap(); for (int i = 0; i < pmap.size(); i++) { @@ -1878,10 +1931,14 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { return; } + if (procsToKill == null) { + procsToKill = new ArrayList<>(); + } // Add process to kill list. procsToKill.add(proc); } } + if (procsToKill == null) return; // Kill the running processes. Post on handle since we don't want to hold the service lock // while calling into AM. @@ -2677,6 +2734,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { processStoppingAndFinishingActivities(null /* launchedActivity */, false /* processPausingActivities */, "transit"); } break; + case KILL_TASK_PROCESSES_TIMEOUT_MSG: { + final Task task = (Task) msg.obj; + if (task.mKillProcessesOnDestroyed) { + Slog.i(TAG, "Destroy timeout of remove-task, attempt to kill " + task); + killTaskProcessesIfPossible(task); + } + } break; case LAUNCH_TASK_BEHIND_COMPLETE: { final ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj); if (r != null) { diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java index 234473959651..6773bcd6fac8 100644 --- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java +++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.provider.DeviceConfig.NAMESPACE_WINDOW_MANAGER; +import static com.android.internal.util.Preconditions.checkState; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ACTIVITY_STARTS; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -45,6 +46,7 @@ import android.util.ArraySet; import android.util.DebugUtils; import android.util.Slog; + import com.android.internal.util.FrameworkStatsLog; import com.android.server.am.PendingIntentRecord; @@ -59,6 +61,9 @@ public class BackgroundActivityStartController { private static final String TAG = TAG_WITH_CLASS_NAME ? "BackgroundActivityStartController" : TAG_ATM; + public static final String VERDICT_ALLOWED = "Activity start allowed"; + public static final String VERDICT_WOULD_BE_ALLOWED_IF_SENDER_GRANTS_BAL = + "Activity start would be allowed if the sender granted BAL privileges"; private final ActivityTaskManagerService mService; private final ActivityTaskSupervisor mSupervisor; @@ -234,10 +239,6 @@ public class BackgroundActivityStartController { // don't abort if the callingUid has a visible window or is a persistent system process final int callingUidProcState = mService.mActiveUids.getUidState(callingUid); final boolean callingUidHasAnyVisibleWindow = mService.hasActiveVisibleWindow(callingUid); - final boolean isCallingUidForeground = - callingUidHasAnyVisibleWindow - || callingUidProcState == ActivityManager.PROCESS_STATE_TOP - || callingUidProcState == ActivityManager.PROCESS_STATE_BOUND_TOP; final boolean isCallingUidPersistentSystemProcess = callingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI; @@ -266,11 +267,6 @@ public class BackgroundActivityStartController { (callingUid == realCallingUid) ? callingUidHasAnyVisibleWindow : mService.hasActiveVisibleWindow(realCallingUid); - final boolean isRealCallingUidForeground = - (callingUid == realCallingUid) - ? isCallingUidForeground - : realCallingUidHasAnyVisibleWindow - || realCallingUidProcState == ActivityManager.PROCESS_STATE_TOP; final int realCallingAppId = UserHandle.getAppId(realCallingUid); final boolean isRealCallingUidPersistentSystemProcess = (callingUid == realCallingUid) @@ -297,75 +293,63 @@ public class BackgroundActivityStartController { final BackgroundStartPrivileges balAllowedByPiSender = PendingIntentRecord.getBackgroundStartPrivilegesAllowedByCaller( checkedOptions, realCallingUid); - if (balAllowedByPiSender.allowsBackgroundActivityStarts() - && realCallingUid != callingUid) { - final boolean useCallerPermission = - PendingIntentRecord.isPendingIntentBalAllowedByPermission(checkedOptions); - if (useCallerPermission - && ActivityManager.checkComponentPermission( - android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, - realCallingUid, - -1, - true) - == PackageManager.PERMISSION_GRANTED) { - return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, - /*background*/ false, callingUid, realCallingUid, intent, - "realCallingUid has BAL permission. realCallingUid: " + realCallingUid); - } - // don't abort if the realCallingUid has a visible window - // TODO(b/171459802): We should check appSwitchAllowed also - if (realCallingUidHasAnyVisibleWindow) { - return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, - /*background*/ false, callingUid, realCallingUid, intent, - "realCallingUid has visible (non-toast) window. realCallingUid: " - + realCallingUid); - } - // if the realCallingUid is a persistent system process, abort if the IntentSender - // wasn't allowed to start an activity - if (isRealCallingUidPersistentSystemProcess - && backgroundStartPrivileges.allowsBackgroundActivityStarts()) { - return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, - /*background*/ false, callingUid, realCallingUid, intent, - "realCallingUid is persistent system process AND intent " - + "sender allowed (allowBackgroundActivityStart = true). " - + "realCallingUid: " + realCallingUid); - } - // don't abort if the realCallingUid is an associated companion app - if (mService.isAssociatedCompanionApp( - UserHandle.getUserId(realCallingUid), realCallingUid)) { - return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, - /*background*/ false, callingUid, realCallingUid, intent, - "realCallingUid is a companion app. " - + "realCallingUid: " + realCallingUid); - } + final boolean logVerdictChangeByPiDefaultChange = checkedOptions == null + || checkedOptions.getPendingIntentBackgroundActivityStartMode() + == ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; + final boolean considerPiRules = logVerdictChangeByPiDefaultChange + || balAllowedByPiSender.allowsBackgroundActivityStarts(); + final String verdictLogForPiSender = + balAllowedByPiSender.allowsBackgroundActivityStarts() ? VERDICT_ALLOWED + : VERDICT_WOULD_BE_ALLOWED_IF_SENDER_GRANTS_BAL; + + @BalCode int resultIfPiSenderAllowsBal = BAL_BLOCK; + if (realCallingUid != callingUid && considerPiRules) { + resultIfPiSenderAllowsBal = checkPiBackgroundActivityStart(callingUid, realCallingUid, + backgroundStartPrivileges, intent, checkedOptions, + realCallingUidHasAnyVisibleWindow, isRealCallingUidPersistentSystemProcess, + verdictLogForPiSender); + } + if (resultIfPiSenderAllowsBal != BAL_BLOCK + && balAllowedByPiSender.allowsBackgroundActivityStarts() + && !logVerdictChangeByPiDefaultChange) { + // The result is to allow (because the sender allows BAL) and we are not interested in + // logging differences, so just return. + return resultIfPiSenderAllowsBal; } if (useCallingUidState) { // don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission if (ActivityTaskManagerService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid) == PERMISSION_GRANTED) { return logStartAllowedAndReturnCode(BAL_ALLOW_PERMISSION, - /*background*/ true, callingUid, realCallingUid, intent, - "START_ACTIVITIES_FROM_BACKGROUND permission granted"); + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, intent, + "START_ACTIVITIES_FROM_BACKGROUND permission granted"); } // don't abort if the caller has the same uid as the recents component if (mSupervisor.mRecentTasks.isCallerRecents(callingUid)) { - return logStartAllowedAndReturnCode(BAL_ALLOW_ALLOWLISTED_COMPONENT, - /*background*/ true, callingUid, realCallingUid, - intent, "Recents Component"); + return logStartAllowedAndReturnCode( + BAL_ALLOW_ALLOWLISTED_COMPONENT, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, + intent, "Recents Component"); } // don't abort if the callingUid is the device owner if (mService.isDeviceOwner(callingUid)) { - return logStartAllowedAndReturnCode(BAL_ALLOW_ALLOWLISTED_COMPONENT, - /*background*/ true, callingUid, realCallingUid, - intent, "Device Owner"); + return logStartAllowedAndReturnCode( + BAL_ALLOW_ALLOWLISTED_COMPONENT, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, + intent, "Device Owner"); } // don't abort if the callingUid has companion device final int callingUserId = UserHandle.getUserId(callingUid); if (mService.isAssociatedCompanionApp(callingUserId, callingUid)) { - return logStartAllowedAndReturnCode(BAL_ALLOW_ALLOWLISTED_COMPONENT, - /*background*/ true, callingUid, realCallingUid, - intent, "Companion App"); + return logStartAllowedAndReturnCode( + BAL_ALLOW_ALLOWLISTED_COMPONENT, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, + intent, "Companion App"); } // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) { @@ -374,18 +358,19 @@ public class BackgroundActivityStartController { "Background activity start for " + callingPackage + " allowed because SYSTEM_ALERT_WINDOW permission is granted."); - return logStartAllowedAndReturnCode(BAL_ALLOW_SAW_PERMISSION, - /*background*/ true, callingUid, realCallingUid, - intent, "SYSTEM_ALERT_WINDOW permission is granted"); + return logStartAllowedAndReturnCode( + BAL_ALLOW_SAW_PERMISSION, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, + intent, "SYSTEM_ALERT_WINDOW permission is granted"); } // don't abort if the callingUid and callingPackage have the // OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION appop if (isSystemExemptFlagEnabled() && mService.getAppOpsManager().checkOpNoThrow( - AppOpsManager.OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION, - callingUid, - callingPackage) - == AppOpsManager.MODE_ALLOWED) { + AppOpsManager.OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION, + callingUid, callingPackage) == AppOpsManager.MODE_ALLOWED) { return logStartAllowedAndReturnCode(BAL_ALLOW_PERMISSION, + resultIfPiSenderAllowsBal, balAllowedByPiSender, /*background*/ true, callingUid, realCallingUid, intent, "OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION appop is granted"); } @@ -395,78 +380,119 @@ public class BackgroundActivityStartController { // up and alive. If that's the case, we retrieve the WindowProcessController for the send() // caller if caller allows, so that we can make the decision based on its state. int callerAppUid = callingUid; - if (callerApp == null && balAllowedByPiSender.allowsBackgroundActivityStarts()) { + boolean callerAppBasedOnPiSender = callerApp == null && considerPiRules + && resultIfPiSenderAllowsBal == BAL_BLOCK; + if (callerAppBasedOnPiSender) { callerApp = mService.getProcessController(realCallingPid, realCallingUid); callerAppUid = realCallingUid; } // don't abort if the callerApp or other processes of that uid are allowed in any way if (callerApp != null && useCallingUidState) { // first check the original calling process - @BalCode int balAllowedForCaller = callerApp + final @BalCode int balAllowedForCaller = callerApp .areBackgroundActivityStartsAllowed(appSwitchState); if (balAllowedForCaller != BAL_BLOCK) { - return logStartAllowedAndReturnCode(balAllowedForCaller, + if (callerAppBasedOnPiSender) { + resultIfPiSenderAllowsBal = logStartAllowedAndReturnCode(balAllowedForCaller, /*background*/ true, callingUid, realCallingUid, intent, "callerApp process (pid = " + callerApp.getPid() - + ", uid = " + callerAppUid + ") is allowed"); - } - // only if that one wasn't allowed, check the other ones - final ArraySet<WindowProcessController> uidProcesses = + + ", uid = " + callerAppUid + ") is allowed", verdictLogForPiSender); + } else { + return logStartAllowedAndReturnCode(balAllowedForCaller, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, intent, + "callerApp process (pid = " + callerApp.getPid() + + ", uid = " + callerAppUid + ") is allowed"); + } + } else { + // only if that one wasn't allowed, check the other ones + final ArraySet<WindowProcessController> uidProcesses = mService.mProcessMap.getProcesses(callerAppUid); - if (uidProcesses != null) { - for (int i = uidProcesses.size() - 1; i >= 0; i--) { - final WindowProcessController proc = uidProcesses.valueAt(i); - int balAllowedForUid = proc.areBackgroundActivityStartsAllowed(appSwitchState); - if (proc != callerApp - && balAllowedForUid != BAL_BLOCK) { - return logStartAllowedAndReturnCode(balAllowedForUid, - /*background*/ true, callingUid, realCallingUid, intent, - "process" + proc.getPid() - + " from uid " + callerAppUid + " is allowed"); + if (uidProcesses != null) { + for (int i = uidProcesses.size() - 1; i >= 0; i--) { + final WindowProcessController proc = uidProcesses.valueAt(i); + int balAllowedForUid = proc.areBackgroundActivityStartsAllowed( + appSwitchState); + if (proc != callerApp && balAllowedForUid != BAL_BLOCK) { + if (callerAppBasedOnPiSender) { + resultIfPiSenderAllowsBal = logStartAllowedAndReturnCode( + balAllowedForUid, + /*background*/ true, callingUid, realCallingUid, intent, + "process" + proc.getPid() + " from uid " + callerAppUid + + " is allowed", verdictLogForPiSender); + break; + } else { + return logStartAllowedAndReturnCode(balAllowedForUid, + resultIfPiSenderAllowsBal, balAllowedByPiSender, + /*background*/ true, callingUid, realCallingUid, intent, + "process" + proc.getPid() + " from uid " + callerAppUid + + " is allowed"); + } + } } } } + if (callerAppBasedOnPiSender) { + // If caller app was based on PI sender, this result is part of + // resultIfPiSenderAllowsBal + if (resultIfPiSenderAllowsBal != BAL_BLOCK + && balAllowedByPiSender.allowsBackgroundActivityStarts() + && !logVerdictChangeByPiDefaultChange) { + // The result is to allow (because the sender allows BAL) and we are not + // interested in logging differences, so just return. + return resultIfPiSenderAllowsBal; + } + } else { + // If caller app was NOT based on PI sender and we found a allow reason we should + // have returned already + checkState(balAllowedForCaller == BAL_BLOCK, + "balAllowedForCaller = " + balAllowedForCaller + " (should have returned)"); + } } - // anything that has fallen through would currently be aborted - Slog.w( - TAG, - "Background activity launch blocked [callingPackage: " - + callingPackage - + "; callingUid: " - + callingUid - + "; appSwitchState: " - + appSwitchState - + "; isCallingUidForeground: " - + isCallingUidForeground - + "; callingUidHasAnyVisibleWindow: " - + callingUidHasAnyVisibleWindow - + "; callingUidProcState: " - + DebugUtils.valueToString( - ActivityManager.class, "PROCESS_STATE_", callingUidProcState) - + "; isCallingUidPersistentSystemProcess: " - + isCallingUidPersistentSystemProcess - + "; realCallingUid: " - + realCallingUid - + "; isRealCallingUidForeground: " - + isRealCallingUidForeground - + "; realCallingUidHasAnyVisibleWindow: " - + realCallingUidHasAnyVisibleWindow - + "; realCallingUidProcState: " - + DebugUtils.valueToString( - ActivityManager.class, "PROCESS_STATE_", realCallingUidProcState) - + "; isRealCallingUidPersistentSystemProcess: " + // If we are here, it means all exemptions not based on PI sender failed, so we'll block + // unless resultIfPiSenderAllowsBal is an allow and the PI sender allows BAL + + String stateDumpLog = " [callingPackage: " + callingPackage + + "; callingUid: " + callingUid + + "; appSwitchState: " + appSwitchState + + "; callingUidHasAnyVisibleWindow: " + callingUidHasAnyVisibleWindow + + "; callingUidProcState: " + DebugUtils.valueToString( + ActivityManager.class, "PROCESS_STATE_", callingUidProcState) + + "; isCallingUidPersistentSystemProcess: " + isCallingUidPersistentSystemProcess + + "; balAllowedByPiSender: " + balAllowedByPiSender + + "; realCallingUid: " + realCallingUid + + "; realCallingUidHasAnyVisibleWindow: " + realCallingUidHasAnyVisibleWindow + + "; realCallingUidProcState: " + DebugUtils.valueToString( + ActivityManager.class, "PROCESS_STATE_", realCallingUidProcState) + + "; isRealCallingUidPersistentSystemProcess: " + isRealCallingUidPersistentSystemProcess - + "; originatingPendingIntent: " - + originatingPendingIntent - + "; backgroundStartPrivileges: " - + backgroundStartPrivileges - + "; intent: " - + intent - + "; callerApp: " - + callerApp - + "; inVisibleTask: " - + (callerApp != null && callerApp.hasActivityInVisibleTask()) - + "]"); + + "; originatingPendingIntent: " + originatingPendingIntent + + "; backgroundStartPrivileges: " + backgroundStartPrivileges + + "; intent: " + intent + + "; callerApp: " + callerApp + + "; inVisibleTask: " + (callerApp != null && callerApp.hasActivityInVisibleTask()) + + "]"; + if (resultIfPiSenderAllowsBal != BAL_BLOCK) { + // We should have returned before if !logVerdictChangeByPiDefaultChange + checkState(logVerdictChangeByPiDefaultChange, + "resultIfPiSenderAllowsBal = " + balCodeToString(resultIfPiSenderAllowsBal) + + " at the end but logVerdictChangeByPiDefaultChange = false"); + if (balAllowedByPiSender.allowsBackgroundActivityStarts()) { + // The verdict changed from block to allow, PI sender default change is off and + // we'd block if it were on + Slog.wtf(TAG, "With BAL hardening this activity start would be blocked!" + + stateDumpLog); + return resultIfPiSenderAllowsBal; + } else { + // The verdict changed from allow (resultIfPiSenderAllowsBal) to block, PI sender + // default change is on (otherwise we would have fallen into if above) and we'd + // allow if it were off + Slog.wtf(TAG, "Without BAL hardening this activity start would NOT be allowed!" + + stateDumpLog); + } + } + // anything that has fallen through would currently be aborted + Slog.w(TAG, "Background activity launch blocked" + stateDumpLog); // log aborted activity start to TRON if (mService.isActivityStartsLoggingEnabled()) { mSupervisor @@ -486,6 +512,51 @@ public class BackgroundActivityStartController { return BAL_BLOCK; } + private @BalCode int checkPiBackgroundActivityStart(int callingUid, int realCallingUid, + BackgroundStartPrivileges backgroundStartPrivileges, Intent intent, + ActivityOptions checkedOptions, boolean realCallingUidHasAnyVisibleWindow, + boolean isRealCallingUidPersistentSystemProcess, String verdictLog) { + final boolean useCallerPermission = + PendingIntentRecord.isPendingIntentBalAllowedByPermission(checkedOptions); + if (useCallerPermission + && ActivityManager.checkComponentPermission( + android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, + realCallingUid, -1, true) == PackageManager.PERMISSION_GRANTED) { + return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, + /*background*/ false, callingUid, realCallingUid, intent, + "realCallingUid has BAL permission. realCallingUid: " + realCallingUid, + verdictLog); + } + + // don't abort if the realCallingUid has a visible window + // TODO(b/171459802): We should check appSwitchAllowed also + if (realCallingUidHasAnyVisibleWindow) { + return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, + /*background*/ false, callingUid, realCallingUid, intent, + "realCallingUid has visible (non-toast) window. realCallingUid: " + + realCallingUid, verdictLog); + } + // if the realCallingUid is a persistent system process, abort if the IntentSender + // wasn't allowed to start an activity + if (isRealCallingUidPersistentSystemProcess + && backgroundStartPrivileges.allowsBackgroundActivityStarts()) { + return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, + /*background*/ false, callingUid, realCallingUid, intent, + "realCallingUid is persistent system process AND intent " + + "sender allowed (allowBackgroundActivityStart = true). " + + "realCallingUid: " + realCallingUid, verdictLog); + } + // don't abort if the realCallingUid is an associated companion app + if (mService.isAssociatedCompanionApp( + UserHandle.getUserId(realCallingUid), realCallingUid)) { + return logStartAllowedAndReturnCode(BAL_ALLOW_PENDING_INTENT, + /*background*/ false, callingUid, realCallingUid, intent, + "realCallingUid is a companion app. " + + "realCallingUid: " + realCallingUid, verdictLog); + } + return BAL_BLOCK; + } + static @BalCode int logStartAllowedAndReturnCode(@BalCode int code, boolean background, int callingUid, int realCallingUid, Intent intent, int pid, String msg) { return logStartAllowedAndReturnCode(code, background, callingUid, realCallingUid, intent, @@ -494,16 +565,43 @@ public class BackgroundActivityStartController { static @BalCode int logStartAllowedAndReturnCode(@BalCode int code, boolean background, int callingUid, int realCallingUid, Intent intent, String msg) { + return logStartAllowedAndReturnCode(code, background, callingUid, realCallingUid, intent, + msg, VERDICT_ALLOWED); + } + + /** + * Logs the start and returns one of the provided codes depending on if the PI sender allows + * using its BAL privileges. + */ + static @BalCode int logStartAllowedAndReturnCode(@BalCode int result, + @BalCode int resultIfPiSenderAllowsBal, BackgroundStartPrivileges balAllowedByPiSender, + boolean background, int callingUid, int realCallingUid, Intent intent, String msg) { + if (resultIfPiSenderAllowsBal != BAL_BLOCK + && balAllowedByPiSender.allowsBackgroundActivityStarts()) { + // resultIfPiSenderAllowsBal was already logged, so just return + return resultIfPiSenderAllowsBal; + } + return logStartAllowedAndReturnCode(result, background, callingUid, realCallingUid, + intent, msg, VERDICT_ALLOWED); + } + + + static @BalCode int logStartAllowedAndReturnCode(@BalCode int code, boolean background, + int callingUid, int realCallingUid, Intent intent, String msg, String verdict) { statsLogBalAllowed(code, callingUid, realCallingUid, intent); if (DEBUG_ACTIVITY_STARTS) { StringBuilder builder = new StringBuilder(); if (background) { builder.append("Background "); } - builder.append("Activity start allowed: " + msg + ". callingUid: " + callingUid + ". "); + builder.append(verdict + ": " + msg + ". callingUid: " + callingUid + ". "); builder.append("BAL Code: "); builder.append(balCodeToString(code)); - Slog.d(TAG, builder.toString()); + if (verdict.equals(VERDICT_ALLOWED)) { + Slog.i(TAG, builder.toString()); + } else { + Slog.d(TAG, builder.toString()); + } } return code; } diff --git a/services/core/java/com/android/server/wm/CompatModePackages.java b/services/core/java/com/android/server/wm/CompatModePackages.java index d5828ef08251..c6978fd59134 100644 --- a/services/core/java/com/android/server/wm/CompatModePackages.java +++ b/services/core/java/com/android/server/wm/CompatModePackages.java @@ -17,7 +17,6 @@ package com.android.server.wm; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION; -import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS; @@ -62,37 +61,60 @@ import java.util.Iterator; import java.util.Map; public final class CompatModePackages { - private static final String TAG = TAG_WITH_CLASS_NAME ? "CompatModePackages" : TAG_ATM; - private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; - - private final ActivityTaskManagerService mService; - private GameManagerInternal mGameManager; - private final AtomicFile mFile; - - // Compatibility state: no longer ask user to select the mode. - private static final int COMPAT_FLAG_DONT_ASK = 1<<0; - // Compatibility state: compatibility mode is enabled. - private static final int COMPAT_FLAG_ENABLED = 1<<1; + /** + * {@link CompatModePackages#DOWNSCALED_INVERSE} is the gatekeeper of all per-app buffer inverse + * downscale changes. Enabling this change will allow the following scaling factors: + * {@link CompatModePackages#DOWNSCALE_90} + * {@link CompatModePackages#DOWNSCALE_85} + * {@link CompatModePackages#DOWNSCALE_80} + * {@link CompatModePackages#DOWNSCALE_75} + * {@link CompatModePackages#DOWNSCALE_70} + * {@link CompatModePackages#DOWNSCALE_65} + * {@link CompatModePackages#DOWNSCALE_60} + * {@link CompatModePackages#DOWNSCALE_55} + * {@link CompatModePackages#DOWNSCALE_50} + * {@link CompatModePackages#DOWNSCALE_45} + * {@link CompatModePackages#DOWNSCALE_40} + * {@link CompatModePackages#DOWNSCALE_35} + * {@link CompatModePackages#DOWNSCALE_30} + * + * If {@link CompatModePackages#DOWNSCALED_INVERSE} is enabled for an app package, then the app + * will be forcibly resized to the lowest enabled scaling factor e.g. 1/0.8 if both 1/0.8 and + * 1/0.7 (* 100%) were enabled. + * + * When both {@link CompatModePackages#DOWNSCALED_INVERSE} + * and {@link CompatModePackages#DOWNSCALED} are enabled, then + * {@link CompatModePackages#DOWNSCALED_INVERSE} takes precedence. + */ + @ChangeId + @Disabled + @Overridable + public static final long DOWNSCALED_INVERSE = 273564678L; // This is a Bug ID. /** - * CompatModePackages#DOWNSCALED is the gatekeeper of all per-app buffer downscaling - * changes. Disabling this change will prevent the following scaling factors from working: - * CompatModePackages#DOWNSCALE_90 - * CompatModePackages#DOWNSCALE_85 - * CompatModePackages#DOWNSCALE_80 - * CompatModePackages#DOWNSCALE_75 - * CompatModePackages#DOWNSCALE_70 - * CompatModePackages#DOWNSCALE_65 - * CompatModePackages#DOWNSCALE_60 - * CompatModePackages#DOWNSCALE_55 - * CompatModePackages#DOWNSCALE_50 - * CompatModePackages#DOWNSCALE_45 - * CompatModePackages#DOWNSCALE_40 - * CompatModePackages#DOWNSCALE_35 - * CompatModePackages#DOWNSCALE_30 + * {@link CompatModePackages#DOWNSCALED} is the gatekeeper of all per-app buffer downscaling + * changes. Enabling this change will allow the following scaling factors: + * {@link CompatModePackages#DOWNSCALE_90} + * {@link CompatModePackages#DOWNSCALE_85} + * {@link CompatModePackages#DOWNSCALE_80} + * {@link CompatModePackages#DOWNSCALE_75} + * {@link CompatModePackages#DOWNSCALE_70} + * {@link CompatModePackages#DOWNSCALE_65} + * {@link CompatModePackages#DOWNSCALE_60} + * {@link CompatModePackages#DOWNSCALE_55} + * {@link CompatModePackages#DOWNSCALE_50} + * {@link CompatModePackages#DOWNSCALE_45} + * {@link CompatModePackages#DOWNSCALE_40} + * {@link CompatModePackages#DOWNSCALE_35} + * {@link CompatModePackages#DOWNSCALE_30} + * + * If {@link CompatModePackages#DOWNSCALED} is enabled for an app package, then the app will be + * forcibly resized to the highest enabled scaling factor e.g. 80% if both 80% and 70% were + * enabled. * - * If CompatModePackages#DOWNSCALED is enabled for an app package, then the app will be forcibly - * resized to the highest enabled scaling factor e.g. 80% if both 80% and 70% were enabled. + * When both {@link CompatModePackages#DOWNSCALED_INVERSE} + * and {@link CompatModePackages#DOWNSCALED} are enabled, then + * {@link CompatModePackages#DOWNSCALED_INVERSE} takes precedence. */ @ChangeId @Disabled @@ -100,9 +122,12 @@ public final class CompatModePackages { public static final long DOWNSCALED = 168419799L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_90 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_90} for a package will force the app to assume it's * running on a display with 90% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 111.11% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -110,9 +135,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_90 = 182811243L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_85 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_85} for a package will force the app to assume it's * running on a display with 85% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 117.65% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -120,9 +148,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_85 = 189969734L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_80 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_80} for a package will force the app to assume it's * running on a display with 80% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 125% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -130,9 +161,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_80 = 176926753L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_75 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_75} for a package will force the app to assume it's * running on a display with 75% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 133.33% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -140,9 +174,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_75 = 189969779L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_70 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_70} for a package will force the app to assume it's * running on a display with 70% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 142.86% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -150,9 +187,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_70 = 176926829L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_65 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_65} for a package will force the app to assume it's * running on a display with 65% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 153.85% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -160,9 +200,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_65 = 189969744L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_60 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_60} for a package will force the app to assume it's * running on a display with 60% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 166.67% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -170,9 +213,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_60 = 176926771L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_55 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_55} for a package will force the app to assume it's * running on a display with 55% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 181.82% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -180,9 +226,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_55 = 189970036L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_50 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_50} for a package will force the app to assume it's * running on a display with 50% vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 200% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -190,9 +239,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_50 = 176926741L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_45 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_45} for a package will force the app to assume it's * running on a display with 45% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 222.22% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -200,9 +252,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_45 = 189969782L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_40 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_40} for a package will force the app to assume it's * running on a display with 40% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 250% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -210,9 +265,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_40 = 189970038L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_35 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_35} for a package will force the app to assume it's * running on a display with 35% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 285.71% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -220,9 +278,12 @@ public final class CompatModePackages { public static final long DOWNSCALE_35 = 189969749L; /** - * With CompatModePackages#DOWNSCALED enabled, subsequently enabling change-id - * CompatModePackages#DOWNSCALE_30 for a package will force the app to assume it's + * With {@link CompatModePackages#DOWNSCALED} enabled, subsequently enabling change-id + * {@link CompatModePackages#DOWNSCALE_30} for a package will force the app to assume it's * running on a display with 30% the vertical and horizontal resolution of the real display. + * + * With {@link CompatModePackages#DOWNSCALED_INVERSE} enabled will force the app to assume it's + * running on a display with 333.33% the vertical and horizontal resolution of the real display */ @ChangeId @Disabled @@ -240,11 +301,15 @@ public final class CompatModePackages { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) private static final long DO_NOT_DOWNSCALE_TO_1080P_ON_TV = 157629738L; // This is a Bug ID. - private final HashMap<String, Integer> mPackages = new HashMap<String, Integer>(); - private static final int MSG_WRITE = 300; - private final CompatHandler mHandler; + private static final String TAG = TAG_WITH_CLASS_NAME ? "CompatModePackages" : TAG_ATM; + + // Compatibility state: no longer ask user to select the mode. + private static final int COMPAT_FLAG_DONT_ASK = 1 << 0; + + // Compatibility state: compatibility mode is enabled. + private static final int COMPAT_FLAG_ENABLED = 1 << 1; private final class CompatHandler extends Handler { public CompatHandler(Looper looper) { @@ -261,6 +326,12 @@ public final class CompatModePackages { } } + private final ActivityTaskManagerService mService; + private GameManagerInternal mGameManager; + private final AtomicFile mFile; + private final HashMap<String, Integer> mPackages = new HashMap<>(); + private final CompatHandler mHandler; + public CompatModePackages(ActivityTaskManagerService service, File systemDir, Handler handler) { mService = service; mFile = new AtomicFile(new File(systemDir, "packages-compat.xml"), "compat-mode"); @@ -390,45 +461,16 @@ public final class CompatModePackages { } } - if (CompatChanges.isChangeEnabled(DOWNSCALED, packageName, userHandle)) { - if (CompatChanges.isChangeEnabled(DOWNSCALE_90, packageName, userHandle)) { - return 1f / 0.9f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_85, packageName, userHandle)) { - return 1f / 0.85f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_80, packageName, userHandle)) { - return 1f / 0.8f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_75, packageName, userHandle)) { - return 1f / 0.75f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_70, packageName, userHandle)) { - return 1f / 0.7f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_65, packageName, userHandle)) { - return 1f / 0.65f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_60, packageName, userHandle)) { - return 1f / 0.6f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_55, packageName, userHandle)) { - return 1f / 0.55f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_50, packageName, userHandle)) { - return 1f / 0.5f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_45, packageName, userHandle)) { - return 1f / 0.45f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_40, packageName, userHandle)) { - return 1f / 0.4f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_35, packageName, userHandle)) { - return 1f / 0.35f; - } - if (CompatChanges.isChangeEnabled(DOWNSCALE_30, packageName, userHandle)) { - return 1f / 0.3f; + final boolean isDownscaledEnabled = CompatChanges.isChangeEnabled( + DOWNSCALED, packageName, userHandle); + final boolean isDownscaledInverseEnabled = CompatChanges.isChangeEnabled( + DOWNSCALED_INVERSE, packageName, userHandle); + if (isDownscaledEnabled || isDownscaledInverseEnabled) { + final float scalingFactor = getScalingFactor(packageName, userHandle); + if (scalingFactor != 1f) { + // For Upscaling the returned factor must be scalingFactor + // For Downscaling the returned factor must be 1f / scalingFactor + return isDownscaledInverseEnabled ? scalingFactor : 1f / scalingFactor; } } @@ -445,6 +487,49 @@ public final class CompatModePackages { return 1f; } + private static float getScalingFactor(String packageName, UserHandle userHandle) { + if (CompatChanges.isChangeEnabled(DOWNSCALE_90, packageName, userHandle)) { + return 0.9f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_85, packageName, userHandle)) { + return 0.85f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_80, packageName, userHandle)) { + return 0.8f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_75, packageName, userHandle)) { + return 0.75f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_70, packageName, userHandle)) { + return 0.7f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_65, packageName, userHandle)) { + return 0.65f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_60, packageName, userHandle)) { + return 0.6f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_55, packageName, userHandle)) { + return 0.55f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_50, packageName, userHandle)) { + return 0.5f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_45, packageName, userHandle)) { + return 0.45f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_40, packageName, userHandle)) { + return 0.4f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_35, packageName, userHandle)) { + return 0.35f; + } + if (CompatChanges.isChangeEnabled(DOWNSCALE_30, packageName, userHandle)) { + return 0.3f; + } + return 1f; + } + public int computeCompatModeLocked(ApplicationInfo ai) { final CompatibilityInfo info = compatibilityInfoForPackageLocked(ai); if (info.alwaysSupportsScreen()) { diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 6af1c7c9d656..72263ffc7de2 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -87,6 +87,8 @@ import java.util.Set; */ public class DisplayRotation { private static final String TAG = TAG_WITH_CLASS_NAME ? "DisplayRotation" : TAG_WM; + // Delay to avoid race between fold update and orientation update. + private static final int ORIENTATION_UPDATE_DELAY_MS = 800; // Delay in milliseconds when updating config due to folding events. This prevents // config changes and unexpected jumps while folding the device to closed state. @@ -1787,15 +1789,15 @@ public class DisplayRotation { mDeviceState = newState; // Now mFoldState is set to HALF_FOLDED, the overrideFrozenRotation function will // return true, so rotation is unlocked. - mService.updateRotation(false /* alwaysSendConfiguration */, - false /* forceRelayout */); } else { mInHalfFoldTransition = true; mDeviceState = newState; - // Tell the device to update its orientation. - mService.updateRotation(false /* alwaysSendConfiguration */, - false /* forceRelayout */); } + UiThread.getHandler().postDelayed( + () -> { + mService.updateRotation(false /* alwaysSendConfiguration */, + false /* forceRelayout */); + }, ORIENTATION_UPDATE_DELAY_MS); // Alert the activity of possible new bounds. UiThread.getHandler().removeCallbacks(mActivityBoundsUpdateCallback); UiThread.getHandler().postDelayed(mActivityBoundsUpdateCallback, diff --git a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java index 41eb2c92923f..fb72d6c6b56d 100644 --- a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java @@ -378,10 +378,7 @@ final class DisplayRotationCompatPolicy { // Checking whether an activity in fullscreen rather than the task as this camera // compat treatment doesn't cover activity embedding. if (topActivity.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) { - if (topActivity.mLetterboxUiController - .isOverrideOrientationOnlyForCameraEnabled()) { - topActivity.recomputeConfiguration(); - } + topActivity.mLetterboxUiController.recomputeConfigurationForCameraCompatIfNeeded(); mDisplayContent.updateOrientation(); return; } @@ -447,9 +444,7 @@ final class DisplayRotationCompatPolicy { || topActivity.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) { return; } - if (topActivity.mLetterboxUiController.isOverrideOrientationOnlyForCameraEnabled()) { - topActivity.recomputeConfiguration(); - } + topActivity.mLetterboxUiController.recomputeConfigurationForCameraCompatIfNeeded(); mDisplayContent.updateOrientation(); } } diff --git a/services/core/java/com/android/server/wm/LetterboxConfiguration.java b/services/core/java/com/android/server/wm/LetterboxConfiguration.java index ec04894b1d42..6936a2dcba19 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfiguration.java +++ b/services/core/java/com/android/server/wm/LetterboxConfiguration.java @@ -53,6 +53,9 @@ final class LetterboxConfiguration { */ static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f; + /** Letterboxed app window position multiplier indicating center position. */ + static final float LETTERBOX_POSITION_MULTIPLIER_CENTER = 0.5f; + /** Enum for Letterbox background type. */ @Retention(RetentionPolicy.SOURCE) @IntDef({LETTERBOX_BACKGROUND_SOLID_COLOR, LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND, @@ -212,6 +215,10 @@ final class LetterboxConfiguration { // otherwise the apps get blacked out when they are resumed and do not have focus yet. private boolean mIsCompatFakeFocusEnabled; + // Whether should use split screen aspect ratio for the activity when camera compat treatment + // is enabled and activity is connected to the camera in fullscreen. + private final boolean mIsCameraCompatSplitScreenAspectRatioEnabled; + // Whether camera compatibility treatment is enabled. // See DisplayRotationCompatPolicy for context. private final boolean mIsCameraCompatTreatmentEnabled; @@ -300,6 +307,8 @@ final class LetterboxConfiguration { R.bool.config_letterboxIsEnabledForTranslucentActivities); mIsCameraCompatTreatmentEnabled = mContext.getResources().getBoolean( R.bool.config_isWindowManagerCameraCompatTreatmentEnabled); + mIsCameraCompatSplitScreenAspectRatioEnabled = mContext.getResources().getBoolean( + R.bool.config_isWindowManagerCameraCompatSplitScreenAspectRatioEnabled); mIsCompatFakeFocusEnabled = mContext.getResources().getBoolean( R.bool.config_isCompatFakeFocusEnabled); mIsPolicyForIgnoringRequestedOrientationEnabled = mContext.getResources().getBoolean( @@ -1122,6 +1131,14 @@ final class LetterboxConfiguration { return mIsPolicyForIgnoringRequestedOrientationEnabled; } + /** + * Whether should use split screen aspect ratio for the activity when camera compat treatment + * is enabled and activity is connected to the camera in fullscreen. + */ + boolean isCameraCompatSplitScreenAspectRatioEnabled() { + return mIsCameraCompatSplitScreenAspectRatioEnabled; + } + /** Whether camera compatibility treatment is enabled. */ boolean isCameraCompatTreatmentEnabled(boolean checkDeviceConfig) { return mIsCameraCompatTreatmentEnabled && (!checkDeviceConfig diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index f6f7b49d6d44..a1e6cd78776c 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -22,6 +22,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FOR import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS; +import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA; @@ -76,6 +77,7 @@ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_LEFT; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_RIGHT; +import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_BOTTOM; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP; @@ -130,6 +132,14 @@ final class LetterboxUiController { private static final float UNDEFINED_ASPECT_RATIO = 0f; + // Minimum value of mSetOrientationRequestCounter before qualifying as orientation request loop + @VisibleForTesting + static final int MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP = 2; + // Used to determine reset of mSetOrientationRequestCounter if next app requested + // orientation is after timeout value + @VisibleForTesting + static final int SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS = 1000; + private final Point mTmpPoint = new Point(); private final LetterboxConfiguration mLetterboxConfiguration; @@ -162,6 +172,8 @@ final class LetterboxUiController { // Corresponds to OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION private final boolean mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled; + // Corresponds to OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED + private final boolean mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled; // Corresponds to OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS private final boolean mIsOverrideEnableCompatFakeFocusEnabled; @@ -186,12 +198,18 @@ final class LetterboxUiController { private float mInheritedMinAspectRatio = UNDEFINED_ASPECT_RATIO; private float mInheritedMaxAspectRatio = UNDEFINED_ASPECT_RATIO; + // Updated when ActivityRecord#setRequestedOrientation is called + private long mTimeMsLastSetOrientationRequest = 0; + @Configuration.Orientation private int mInheritedOrientation = ORIENTATION_UNDEFINED; // The app compat state for the opaque activity if any private int mInheritedAppCompatState = APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; + // Counter for ActivityRecord#setRequestedOrientation + private int mSetOrientationRequestCounter = 0; + // The CompatDisplayInsets of the opaque activity beneath the translucent one. private ActivityRecord.CompatDisplayInsets mInheritedCompatDisplayInsets; @@ -220,6 +238,8 @@ final class LetterboxUiController { private boolean mIsRelauchingAfterRequestedOrientationChanged; + private boolean mDoubleTapEvent; + LetterboxUiController(WindowManagerService wmService, ActivityRecord activityRecord) { mLetterboxConfiguration = wmService.mLetterboxConfiguration; // Given activityRecord may not be fully constructed since LetterboxUiController @@ -284,6 +304,9 @@ final class LetterboxUiController { mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled = isCompatChangeEnabled(OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION); + mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled = + isCompatChangeEnabled( + OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED); mIsOverrideEnableCompatFakeFocusEnabled = isCompatChangeEnabled(OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS); @@ -319,6 +342,10 @@ final class LetterboxUiController { mLetterbox.destroy(); mLetterbox = null; } + if (mLetterboxConfigListener != null) { + mLetterboxConfigListener.onRemoved(); + mLetterboxConfigListener = null; + } } void onMovedToDisplay(int displayId) { @@ -350,35 +377,79 @@ final class LetterboxUiController { * <li>Opt-in component property or per-app override are enabled * <li>Activity is relaunched after {@link android.app.Activity#setRequestedOrientation} * call from an app or camera compat force rotation treatment is active for the activity. + * <li>Orientation request loop detected and is not letterboxed for fixed orientation * </ul> */ boolean shouldIgnoreRequestedOrientation(@ScreenOrientation int requestedOrientation) { - if (!shouldEnableWithOverrideAndProperty( + if (shouldEnableWithOverrideAndProperty( /* gatingCondition */ mLetterboxConfiguration ::isPolicyForIgnoringRequestedOrientationEnabled, mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled, mBooleanPropertyIgnoreRequestedOrientation)) { - return false; + if (mIsRelauchingAfterRequestedOrientationChanged) { + Slog.w(TAG, "Ignoring orientation update to " + + screenOrientationToString(requestedOrientation) + + " due to relaunching after setRequestedOrientation for " + + mActivityRecord); + return true; + } + if (isCameraCompatTreatmentActive()) { + Slog.w(TAG, "Ignoring orientation update to " + + screenOrientationToString(requestedOrientation) + + " due to camera compat treatment for " + mActivityRecord); + return true; + } } - if (mIsRelauchingAfterRequestedOrientationChanged) { + + if (shouldIgnoreOrientationRequestLoop()) { Slog.w(TAG, "Ignoring orientation update to " + screenOrientationToString(requestedOrientation) - + " due to relaunching after setRequestedOrientation for " + mActivityRecord); + + " as orientation request loop was detected for " + + mActivityRecord); return true; } - DisplayContent displayContent = mActivityRecord.mDisplayContent; - if (displayContent == null) { + return false; + } + + /** + * Whether an app is calling {@link android.app.Activity#setRequestedOrientation} + * in a loop and orientation request should be ignored. + * + * <p>This should only be called once in response to + * {@link android.app.Activity#setRequestedOrientation}. See + * {@link #shouldIgnoreRequestedOrientation} for more details. + * + * <p>This treatment is enabled when the following conditions are met: + * <ul> + * <li>Per-app override is enabled + * <li>App has requested orientation more than 2 times within 1-second + * timer and activity is not letterboxed for fixed orientation + * </ul> + */ + @VisibleForTesting + boolean shouldIgnoreOrientationRequestLoop() { + if (!mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled) { return false; } - if (displayContent.mDisplayRotationCompatPolicy != null - && displayContent.mDisplayRotationCompatPolicy - .isTreatmentEnabledForActivity(mActivityRecord)) { - Slog.w(TAG, "Ignoring orientation update to " - + screenOrientationToString(requestedOrientation) - + " due to camera compat treatment for " + mActivityRecord); - return true; + + final long currTimeMs = System.currentTimeMillis(); + if (currTimeMs - mTimeMsLastSetOrientationRequest + < SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS) { + mSetOrientationRequestCounter += 1; + } else { + // Resets app setOrientationRequest counter if timed out + mSetOrientationRequestCounter = 0; } - return false; + // Update time last called + mTimeMsLastSetOrientationRequest = currTimeMs; + + return mSetOrientationRequestCounter >= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP + && !mActivityRecord.isLetterboxedForFixedOrientationAndAspectRatio(); + } + + @VisibleForTesting + int getSetOrientationRequestCounter() { + return mSetOrientationRequestCounter; } /** @@ -560,6 +631,16 @@ final class LetterboxUiController { mBooleanPropertyCameraCompatAllowForceRotation); } + private boolean isCameraCompatTreatmentActive() { + DisplayContent displayContent = mActivityRecord.mDisplayContent; + if (displayContent == null) { + return false; + } + return displayContent.mDisplayRotationCompatPolicy != null + && displayContent.mDisplayRotationCompatPolicy + .isTreatmentEnabledForActivity(mActivityRecord); + } + private boolean isCompatChangeEnabled(long overrideChangeId) { return mActivityRecord.info.isChangeEnabled(overrideChangeId); } @@ -745,11 +826,19 @@ final class LetterboxUiController { final Rect innerFrame = hasInheritedLetterboxBehavior() ? mActivityRecord.getBounds() : w.getFrame(); mLetterbox.layout(spaceToFill, innerFrame, mTmpPoint); + // We need to notify Shell that letterbox position has changed. + mActivityRecord.getTask().dispatchTaskInfoChangedIfNeeded(true /* force */); } else if (mLetterbox != null) { mLetterbox.hide(); } } + boolean isFromDoubleTap() { + final boolean isFromDoubleTap = mDoubleTapEvent; + mDoubleTapEvent = false; + return isFromDoubleTap; + } + SurfaceControl getLetterboxParentSurface() { if (mActivityRecord.isInLetterboxAnimation()) { return mActivityRecord.getTask().getSurfaceControl(); @@ -820,13 +909,42 @@ final class LetterboxUiController { } float getFixedOrientationLetterboxAspectRatio(@NonNull Configuration parentConfiguration) { - // Don't resize to split screen size when half folded if letterbox position is centered - return isDisplayFullScreenAndSeparatingHinge() - && getHorizontalPositionMultiplier(parentConfiguration) != 0.5f - ? getSplitScreenAspectRatio() - : mActivityRecord.shouldCreateCompatDisplayInsets() - ? getDefaultMinAspectRatioForUnresizableApps() - : getDefaultMinAspectRatio(); + return shouldUseSplitScreenAspectRatio(parentConfiguration) + ? getSplitScreenAspectRatio() + : mActivityRecord.shouldCreateCompatDisplayInsets() + ? getDefaultMinAspectRatioForUnresizableApps() + : getDefaultMinAspectRatio(); + } + + void recomputeConfigurationForCameraCompatIfNeeded() { + if (isOverrideOrientationOnlyForCameraEnabled() + || isCameraCompatSplitScreenAspectRatioAllowed()) { + mActivityRecord.recomputeConfiguration(); + } + } + + /** + * Whether we use split screen aspect ratio for the activity when camera compat treatment + * is active because the corresponding config is enabled and activity supports resizing. + */ + private boolean isCameraCompatSplitScreenAspectRatioAllowed() { + return mLetterboxConfiguration.isCameraCompatSplitScreenAspectRatioEnabled() + && !mActivityRecord.shouldCreateCompatDisplayInsets(); + } + + private boolean shouldUseSplitScreenAspectRatio(@NonNull Configuration parentConfiguration) { + final boolean isBookMode = isDisplayFullScreenAndInPosture( + DeviceStateController.DeviceState.HALF_FOLDED, + /* isTabletop */ false); + final boolean isNotCenteredHorizontally = getHorizontalPositionMultiplier( + parentConfiguration) != LETTERBOX_POSITION_MULTIPLIER_CENTER; + final boolean isTabletopMode = isDisplayFullScreenAndInPosture( + DeviceStateController.DeviceState.HALF_FOLDED, + /* isTabletop */ true); + // Don't resize to split screen size when in book mode if letterbox position is centered + return ((isBookMode && isNotCenteredHorizontally) || isTabletopMode) + || isCameraCompatSplitScreenAspectRatioAllowed() + && isCameraCompatTreatmentActive(); } private float getDefaultMinAspectRatioForUnresizableApps() { @@ -877,6 +995,20 @@ final class LetterboxUiController { return mActivityRecord.mWmService.mContext.getResources(); } + @LetterboxConfiguration.LetterboxVerticalReachabilityPosition + int getLetterboxPositionForVerticalReachability() { + final boolean isInFullScreenTabletopMode = isDisplayFullScreenAndSeparatingHinge(); + return mLetterboxConfiguration.getLetterboxPositionForVerticalReachability( + isInFullScreenTabletopMode); + } + + @LetterboxConfiguration.LetterboxHorizontalReachabilityPosition + int getLetterboxPositionForHorizontalReachability() { + final boolean isInFullScreenBookMode = isFullScreenAndBookModeEnabled(); + return mLetterboxConfiguration.getLetterboxPositionForHorizontalReachability( + isInFullScreenBookMode); + } + @VisibleForTesting void handleHorizontalDoubleTap(int x) { if (!isHorizontalReachabilityEnabled() || mActivityRecord.isInTransition()) { @@ -913,7 +1045,7 @@ final class LetterboxUiController { : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__LEFT_TO_CENTER; logLetterboxPositionChange(changeToLog); } - + mDoubleTapEvent = true; // TODO(197549949): Add animation for transition. mActivityRecord.recomputeConfiguration(); } @@ -952,7 +1084,7 @@ final class LetterboxUiController { : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__TOP_TO_CENTER; logLetterboxPositionChange(changeToLog); } - + mDoubleTapEvent = true; // TODO(197549949): Add animation for transition. mActivityRecord.recomputeConfiguration(); } @@ -986,6 +1118,10 @@ final class LetterboxUiController { return isHorizontalReachabilityEnabled(mActivityRecord.getParent().getConfiguration()); } + boolean isLetterboxDoubleTapEducationEnabled() { + return isHorizontalReachabilityEnabled() || isVerticalReachabilityEnabled(); + } + /** * Whether vertical reachability is enabled for an activity in the current configuration. * @@ -1488,6 +1624,10 @@ final class LetterboxUiController { return mInheritedCompatDisplayInsets; } + void clearInheritedCompatDisplayInsets() { + mInheritedCompatDisplayInsets = null; + } + /** * In case of translucent activities, it consumes the {@link ActivityRecord} of the first opaque * activity beneath using the given consumer and returns {@code true}. diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index dcb7fe3fbc8b..0c98fb5000d5 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -1014,9 +1014,7 @@ public class LockTaskController { */ boolean isBaseOfLockedTask(String packageName) { for (int i = 0; i < mLockTaskModeTasks.size(); i++) { - final Intent bi = mLockTaskModeTasks.get(i).getBaseIntent(); - if (bi != null && packageName.equals(bi.getComponent() - .getPackageName())) { + if (packageName.equals(mLockTaskModeTasks.get(i).getBasePackageName())) { return true; } } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index cb94146b2ff2..dda0d6c3c3f2 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -682,10 +682,8 @@ class RecentTasks { void removeTasksByPackageName(String packageName, int userId) { for (int i = mTasks.size() - 1; i >= 0; --i) { final Task task = mTasks.get(i); - final String taskPackageName = - task.getBaseIntent().getComponent().getPackageName(); if (task.mUserId != userId) continue; - if (!taskPackageName.equals(packageName)) continue; + if (!task.getBasePackageName().equals(packageName)) continue; mSupervisor.removeTask(task, true, REMOVE_FROM_RECENTS, "remove-package-task"); } @@ -859,8 +857,7 @@ class RecentTasks { if (task.effectiveUid != callingUid) { continue; } - Intent intent = task.getBaseIntent(); - if (intent == null || !callingPackage.equals(intent.getComponent().getPackageName())) { + if (!callingPackage.equals(task.getBasePackageName())) { continue; } AppTaskImpl taskImpl = new AppTaskImpl(mService, task.mTaskId, callingUid); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 68b2d0fc50d5..5a4615ad9578 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -374,6 +374,13 @@ class Task extends TaskFragment { * determining the order when restoring. */ long mLastTimeMoved; + /** + * If it is set, the processes belong to the task will be killed when one of its activity + * reports that Activity#onDestroy is done and the task no longer contains perceptible + * components. This should only be set on a leaf task. + */ + boolean mKillProcessesOnDestroyed; + /** If original intent did not allow relinquishing task identity, save that information */ private boolean mNeverRelinquishIdentity = true; @@ -1325,6 +1332,20 @@ class Task extends TaskFragment { return (topTask != this && topTask != null) ? topTask.getBaseIntent() : null; } + /** + * Returns the package name which stands for this task. It is empty string if no activities + * have been added to this task. + */ + @NonNull + String getBasePackageName() { + final Intent intent = getBaseIntent(); + if (intent == null) { + return ""; + } + final ComponentName componentName = intent.getComponent(); + return componentName != null ? componentName.getPackageName() : ""; + } + /** Returns the first non-finishing activity from the bottom. */ ActivityRecord getRootActivity() { // TODO: Figure out why we historical ignore relinquish identity for this case... @@ -1429,14 +1450,22 @@ class Task extends TaskFragment { // Only set this based on the first activity if (!hadActivity) { - if (r.getActivityType() == ACTIVITY_TYPE_UNDEFINED) { + int activityOverrideType = + r.getRequestedOverrideConfiguration().windowConfiguration.getActivityType(); + if (activityOverrideType == ACTIVITY_TYPE_UNDEFINED) { // Normally non-standard activity type for the activity record will be set when the // object is created, however we delay setting the standard application type until // this point so that the task can set the type for additional activities added in // the else condition below. - r.setActivityType(ACTIVITY_TYPE_STANDARD); - } - setActivityType(r.getActivityType()); + activityOverrideType = activityType != ACTIVITY_TYPE_UNDEFINED ? activityType + : ACTIVITY_TYPE_STANDARD; + // Set the Activity's requestedOverrideConfiguration directly to reduce + // WC#onConfigurationChanged calls since it will be called while setting the + // Task's activity type below. + r.getRequestedOverrideConfiguration().windowConfiguration.setActivityType( + activityOverrideType); + } + setActivityType(activityOverrideType); isPersistable = r.isPersistable(); mCallingUid = r.launchedFromUid; mCallingPackage = r.launchedFromPackage; @@ -3392,6 +3421,26 @@ class Task extends TaskFragment { info.isFocused = isFocused(); info.isVisible = hasVisibleChildren(); info.isSleeping = shouldSleepActivities(); + info.isLetterboxDoubleTapEnabled = top != null + && top.mLetterboxUiController.isLetterboxDoubleTapEducationEnabled(); + info.topActivityLetterboxVerticalPosition = TaskInfo.PROPERTY_VALUE_UNSET; + info.topActivityLetterboxHorizontalPosition = TaskInfo.PROPERTY_VALUE_UNSET; + info.topActivityLetterboxWidth = TaskInfo.PROPERTY_VALUE_UNSET; + info.topActivityLetterboxHeight = TaskInfo.PROPERTY_VALUE_UNSET; + info.isFromLetterboxDoubleTap = top != null && top.mLetterboxUiController.isFromDoubleTap(); + if (info.isLetterboxDoubleTapEnabled) { + info.topActivityLetterboxWidth = top.getBounds().width(); + info.topActivityLetterboxHeight = top.getBounds().height(); + if (info.topActivityLetterboxWidth < info.topActivityLetterboxHeight) { + // Pillarboxed + info.topActivityLetterboxHorizontalPosition = + top.mLetterboxUiController.getLetterboxPositionForHorizontalReachability(); + } else { + // Letterboxed + info.topActivityLetterboxVerticalPosition = + top.mLetterboxUiController.getLetterboxPositionForVerticalReachability(); + } + } } /** @@ -3660,6 +3709,9 @@ class Task extends TaskFragment { if (mSharedStartingData != null) { pw.println(prefix + "mSharedStartingData=" + mSharedStartingData); } + if (mKillProcessesOnDestroyed) { + pw.println(prefix + "mKillProcessesOnDestroyed=true"); + } pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" rootTaskId=" + getRootTaskId()); pw.print(prefix); pw.println("hasChildPipActivity=" + (mChildPipActivity != null)); @@ -5756,8 +5808,6 @@ class Task extends TaskFragment { final int activityType = getActivityType(); task = new Task.Builder(mAtmService) .setTaskId(taskId) - .setActivityType(activityType != ACTIVITY_TYPE_UNDEFINED ? activityType - : ACTIVITY_TYPE_STANDARD) .setActivityInfo(info) .setActivityOptions(options) .setIntent(intent) diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 6bc9fa4f3b46..612fc4be70db 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2553,13 +2553,18 @@ class TaskFragment extends WindowContainer<WindowContainer> { return task != null && !task.isDragResizing() && super.canStartChangeTransition(); } - /** Records the starting bounds of the closing organized TaskFragment. */ - void setClosingChangingStartBoundsIfNeeded() { + /** + * Returns {@code true} if the starting bounds of the closing organized TaskFragment is + * recorded. Otherwise, return {@code false}. + */ + boolean setClosingChangingStartBoundsIfNeeded() { if (isOrganizedTaskFragment() && mDisplayContent != null && mDisplayContent.mChangingContainers.remove(this)) { mDisplayContent.mClosingChangingContainers.put( this, new Rect(mSurfaceFreezer.mFreezeBounds)); + return true; } + return false; } @Override diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 586f96d31cb1..bd0344faa078 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1328,14 +1328,18 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // If we are losing visibility, then a snapshot isn't necessary and we are no-longer // part of a change transition. if (!visible) { + boolean skipUnfreeze = false; if (asTaskFragment() != null) { // If the organized TaskFragment is closing while resizing, we want to keep track of // its starting bounds to make sure the animation starts at the correct position. // This should be called before unfreeze() because we record the starting bounds // in SurfaceFreezer. - asTaskFragment().setClosingChangingStartBoundsIfNeeded(); + skipUnfreeze = asTaskFragment().setClosingChangingStartBoundsIfNeeded(); + } + + if (!skipUnfreeze) { + mSurfaceFreezer.unfreeze(getSyncTransaction()); } - mSurfaceFreezer.unfreeze(getSyncTransaction()); } WindowContainer parent = getParent(); if (parent != null) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a55c7c1ce10b..c599da84e8d9 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -527,6 +527,16 @@ public class WindowManagerService extends IWindowManager.Stub // everything else on screen). Otherwise, it will be put under always-on-top stacks. final boolean mAssistantOnTopOfDream; + /** + * If true, don't relaunch the activity upon receiving a configuration change to transition to + * or from the {@link UI_MODE_TYPE_DESK} uiMode, which is sent when docking. The configuration + * change will still be sent regardless, only the relaunch is skipped. Apps with desk resources + * are exempt from this and will behave like normal, since they may expect the relaunch upon the + * desk uiMode change. + */ + @VisibleForTesting + boolean mSkipActivityRelaunchWhenDocking; + final boolean mLimitedAlphaCompositing; final int mMaxUiWidth; @@ -1176,6 +1186,8 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_perDisplayFocusEnabled); mAssistantOnTopOfDream = context.getResources().getBoolean( com.android.internal.R.bool.config_assistantOnTopOfDream); + mSkipActivityRelaunchWhenDocking = context.getResources() + .getBoolean(R.bool.config_skipActivityRelaunchWhenDocking); mLetterboxConfiguration = new LetterboxConfiguration( // Using SysUI context to have access to Material colors extracted from Wallpaper. diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 8685723a5807..c34aa2b336cd 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -378,8 +378,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } void handleAppCrash() { - for (int i = mActivities.size() - 1; i >= 0; --i) { - final ActivityRecord r = mActivities.get(i); + ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities); + for (int i = activities.size() - 1; i >= 0; --i) { + final ActivityRecord r = activities.get(i); Slog.w(TAG, " Force finishing activity " + r.mActivityComponent.flattenToShortString()); r.detachFromProcess(); diff --git a/services/core/jni/com_android_server_sensor_SensorService.cpp b/services/core/jni/com_android_server_sensor_SensorService.cpp index a916b64fc0bd..eb729de6afd4 100644 --- a/services/core/jni/com_android_server_sensor_SensorService.cpp +++ b/services/core/jni/com_android_server_sensor_SensorService.cpp @@ -55,7 +55,8 @@ public: void registerProximityActiveListener(); void unregisterProximityActiveListener(); jint registerRuntimeSensor(JNIEnv* env, jint deviceId, jint type, jstring name, jstring vendor, - jint flags, jobject callback); + jfloat maximumRange, jfloat resolution, jfloat power, jint minDelay, + jint maxDelay, jint flags, jobject callback); void unregisterRuntimeSensor(jint handle); jboolean sendRuntimeSensorEvent(JNIEnv* env, jint handle, jint type, jlong timestamp, jfloatArray values); @@ -119,7 +120,9 @@ void NativeSensorService::unregisterProximityActiveListener() { } jint NativeSensorService::registerRuntimeSensor(JNIEnv* env, jint deviceId, jint type, jstring name, - jstring vendor, jint flags, jobject callback) { + jstring vendor, jfloat maximumRange, + jfloat resolution, jfloat power, jint minDelay, + jint maxDelay, jint flags, jobject callback) { if (mService == nullptr) { ALOGD("Dropping registerRuntimeSensor, sensor service not available."); return -1; @@ -130,6 +133,11 @@ jint NativeSensorService::registerRuntimeSensor(JNIEnv* env, jint deviceId, jint .vendor = env->GetStringUTFChars(vendor, 0), .version = sizeof(sensor_t), .type = type, + .maxRange = maximumRange, + .resolution = resolution, + .power = power, + .minDelay = minDelay, + .maxDelay = maxDelay, #ifdef __LP64__ .flags = static_cast<uint64_t>(flags), #else @@ -299,10 +307,12 @@ static void unregisterProximityActiveListenerNative(JNIEnv* env, jclass, jlong p } static jint registerRuntimeSensorNative(JNIEnv* env, jclass, jlong ptr, jint deviceId, jint type, - jstring name, jstring vendor, jint flags, - jobject callback) { + jstring name, jstring vendor, jfloat maximumRange, + jfloat resolution, jfloat power, jint minDelay, + jint maxDelay, jint flags, jobject callback) { auto* service = reinterpret_cast<NativeSensorService*>(ptr); - return service->registerRuntimeSensor(env, deviceId, type, name, vendor, flags, callback); + return service->registerRuntimeSensor(env, deviceId, type, name, vendor, maximumRange, + resolution, power, minDelay, maxDelay, flags, callback); } static void unregisterRuntimeSensorNative(JNIEnv* env, jclass, jlong ptr, jint handle) { @@ -324,7 +334,7 @@ static const JNINativeMethod methods[] = { {"unregisterProximityActiveListenerNative", "(J)V", reinterpret_cast<void*>(unregisterProximityActiveListenerNative)}, {"registerRuntimeSensorNative", - "(JIILjava/lang/String;Ljava/lang/String;IL" RUNTIME_SENSOR_CALLBACK_CLASS ";)I", + "(JIILjava/lang/String;Ljava/lang/String;FFFIIIL" RUNTIME_SENSOR_CALLBACK_CLASS ";)I", reinterpret_cast<void*>(registerRuntimeSensorNative)}, {"unregisterRuntimeSensorNative", "(JI)V", reinterpret_cast<void*>(unregisterRuntimeSensorNative)}, diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 06fe4f0b874b..687c86190fbd 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -16,6 +16,7 @@ package com.android.server.credentials; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; @@ -31,6 +32,7 @@ import android.credentials.ui.RequestInfo; import android.os.CancellationSignal; import android.os.RemoteException; import android.service.credentials.CallingAppInfo; +import android.service.credentials.PermissionUtils; import android.util.Log; import com.android.server.credentials.metrics.ApiName; @@ -88,7 +90,9 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent( RequestInfo.newCreateRequestInfo( mRequestId, mClientRequest, - mClientAppInfo.getPackageName()), + mClientAppInfo.getPackageName(), + PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), + Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)), providerDataList)); } catch (RemoteException e) { mChosenProviderFinalPhaseMetric.setUiReturned(false); diff --git a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java index 9165901ad81e..f48fc2c37aff 100644 --- a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java @@ -16,6 +16,7 @@ package com.android.server.credentials; +import android.Manifest; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.ComponentName; @@ -28,17 +29,20 @@ import android.credentials.GetCredentialResponse; import android.credentials.IGetCredentialCallback; import android.credentials.IPrepareGetCredentialCallback; import android.credentials.PrepareGetCredentialResponseInternal; +import android.credentials.ui.GetCredentialProviderData; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; import android.os.CancellationSignal; import android.os.RemoteException; import android.service.credentials.CallingAppInfo; +import android.service.credentials.PermissionUtils; import android.util.Log; import com.android.server.credentials.metrics.ApiName; import com.android.server.credentials.metrics.ProviderStatusForMetrics; import java.util.ArrayList; +import java.util.Set; import java.util.stream.Collectors; /** @@ -222,30 +226,33 @@ public class PrepareGetRequestSession extends RequestSession<GetCredentialReques // If all provider responses have been received, we can either need the UI, // or we need to respond with error. The only other case is the entry being // selected after the UI has been invoked which has a separate code path. - if (isUiInvocationNeeded()) { - if (mIsInitialQuery) { - try { - mPrepareGetCredentialCallback.onResponse( - new PrepareGetCredentialResponseInternal( - false, null, false, false, getUiIntent())); - } catch (Exception e) { - Log.e(TAG, "EXCEPTION while mPendingCallback.onResponse", e); + if (mIsInitialQuery) { + // First time in this state. UI shouldn't be invoked because developer wants to + // punt it for later + boolean hasQueryCandidatePermission = PermissionUtils.hasPermission( + mContext, + mClientAppInfo.getPackageName(), + Manifest.permission.CREDENTIAL_MANAGER_QUERY_CANDIDATE_CREDENTIALS); + if (isUiInvocationNeeded()) { + ArrayList<ProviderData> providerData = getProviderDataForUi(); + if (!providerData.isEmpty()) { + constructPendingResponseAndInvokeCallback(hasQueryCandidatePermission, + getCredentialResultTypes(hasQueryCandidatePermission), + hasAuthenticationResults(providerData, hasQueryCandidatePermission), + hasRemoteResults(providerData, hasQueryCandidatePermission), + getUiIntent()); + } else { + constructEmptyPendingResponseAndInvokeCallback(hasQueryCandidatePermission); } - mIsInitialQuery = false; } else { - getProviderDataAndInitiateUi(); + constructEmptyPendingResponseAndInvokeCallback(hasQueryCandidatePermission); } + mIsInitialQuery = false; } else { - if (mIsInitialQuery) { - try { - mPrepareGetCredentialCallback.onResponse( - new PrepareGetCredentialResponseInternal( - false, null, false, false, null)); - } catch (Exception e) { - Log.e(TAG, "EXCEPTION while mPendingCallback.onResponse", e); - } - mIsInitialQuery = false; - // TODO(273308895): should also clear session here + // Not the first time. This could be a result of a user selection leading to a UI + // invocation again. + if (isUiInvocationNeeded()) { + getProviderDataAndInitiateUi(); } else { respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL, "No credentials available"); @@ -254,6 +261,68 @@ public class PrepareGetRequestSession extends RequestSession<GetCredentialReques } } + private void constructPendingResponseAndInvokeCallback(boolean hasPermission, + Set<String> credentialTypes, + boolean hasAuthenticationResults, boolean hasRemoteResults, PendingIntent uiIntent) { + try { + mPrepareGetCredentialCallback.onResponse( + new PrepareGetCredentialResponseInternal( + hasPermission, + credentialTypes, hasAuthenticationResults, hasRemoteResults, uiIntent)); + } catch (RemoteException e) { + Log.e(TAG, "EXCEPTION while mPendingCallback.onResponse", e); + } + } + + private void constructEmptyPendingResponseAndInvokeCallback( + boolean hasQueryCandidatePermission) { + try { + mPrepareGetCredentialCallback.onResponse( + new PrepareGetCredentialResponseInternal( + hasQueryCandidatePermission, + /*credentialResultTypes=*/ null, + /*hasAuthenticationResults=*/false, + /*hasRemoteResults=*/ false, + /*pendingIntent=*/ null)); + } catch (RemoteException e) { + Log.e(TAG, "EXCEPTION while mPendingCallback.onResponse", e); + } + } + + private boolean hasRemoteResults(ArrayList<ProviderData> providerData, + boolean hasQueryCandidatePermission) { + if (!hasQueryCandidatePermission) { + return false; + } + return providerData.stream() + .map(data -> (GetCredentialProviderData) data) + .anyMatch(getCredentialProviderData -> + getCredentialProviderData.getRemoteEntry() != null); + } + + private boolean hasAuthenticationResults(ArrayList<ProviderData> providerData, + boolean hasQueryCandidatePermission) { + if (!hasQueryCandidatePermission) { + return false; + } + return providerData.stream() + .map(data -> (GetCredentialProviderData) data) + .anyMatch(getCredentialProviderData -> + !getCredentialProviderData.getAuthenticationEntries().isEmpty()); + } + + @Nullable + private Set<String> getCredentialResultTypes(boolean hasQueryCandidatePermission) { + if (!hasQueryCandidatePermission) { + return null; + } + return mProviders.values().stream() + .map(session -> (ProviderGetSession) session) + .flatMap(providerGetSession -> providerGetSession + .getCredentialEntryTypes().stream()) + .collect(Collectors.toSet()); + } + private PendingIntent getUiIntent() { ArrayList<ProviderData> providerDataList = new ArrayList<>(); for (ProviderSession session : mProviders.values()) { diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java index d17e98439978..7d3c86b3ad12 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java @@ -47,9 +47,11 @@ import com.android.server.credentials.metrics.EntryEnum; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; /** @@ -95,7 +97,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential android.credentials.GetCredentialRequest filteredRequest = filterOptions(providerInfo.getCapabilities(), getRequestSession.mClientRequest, - providerInfo.getComponentName()); + providerInfo); if (filteredRequest != null) { Map<String, CredentialOption> beginGetOptionToCredentialOptionMap = new HashMap<>(); @@ -120,7 +122,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential } /** Creates a new provider session to be used by the request session. */ - @Nullable public static ProviderGetSession createNewSession( + @Nullable + public static ProviderGetSession createNewSession( Context context, @UserIdInt int userId, CredentialProviderInfo providerInfo, @@ -129,7 +132,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential android.credentials.GetCredentialRequest filteredRequest = filterOptions(providerInfo.getCapabilities(), getRequestSession.mClientRequest, - providerInfo.getComponentName()); + providerInfo); if (filteredRequest != null) { Map<String, CredentialOption> beginGetOptionToCredentialOptionMap = new HashMap<>(); @@ -178,12 +181,13 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential private static android.credentials.GetCredentialRequest filterOptions( List<String> providerCapabilities, android.credentials.GetCredentialRequest clientRequest, - ComponentName componentName + CredentialProviderInfo info ) { List<CredentialOption> filteredOptions = new ArrayList<>(); for (CredentialOption option : clientRequest.getCredentialOptions()) { if (providerCapabilities.contains(option.getType()) - && isProviderAllowed(option, componentName)) { + && isProviderAllowed(option, info.getComponentName()) + && checkSystemProviderRequirement(option, info.isSystemProvider())) { Log.i(TAG, "In createProviderRequest - capability found : " + option.getType()); filteredOptions.add(option); @@ -212,6 +216,15 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential return true; } + private static boolean checkSystemProviderRequirement(CredentialOption option, + boolean isSystemProvider) { + if (option.isSystemProviderRequired() && !isSystemProvider) { + Log.d(TAG, "System provider required, but this service is not a system provider"); + return false; + } + return true; + } + public ProviderGetSession(Context context, CredentialProviderInfo info, ProviderInternalCallback<GetCredentialResponse> callbacks, @@ -327,6 +340,11 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential } } + @NonNull + protected Set<String> getCredentialEntryTypes() { + return mProviderResponseDataHandler.getCredentialEntryTypes(); + } + @Override // Call from request session to data to be shown on the UI @Nullable protected GetCredentialProviderData prepareUiData() throws IllegalArgumentException { @@ -564,6 +582,9 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential private final Map<String, Pair<Action, AuthenticationEntry>> mUiAuthenticationEntries = new HashMap<>(); + @NonNull + private final Set<String> mCredentialEntryTypes = new HashSet<>(); + @Nullable private Pair<String, Pair<RemoteEntry, Entry>> mUiRemoteEntry = null; @@ -596,6 +617,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential id, credentialEntry.getSlice(), setUpFillInIntent(credentialEntry.getBeginGetCredentialOptionId())); mUiCredentialEntries.put(id, new Pair<>(credentialEntry, entry)); + mCredentialEntryTypes.add(credentialEntry.getType()); } public void addAction(Action action) { @@ -692,6 +714,11 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential && response.getRemoteCredentialEntry() == null; } + @NonNull + public Set<String> getCredentialEntryTypes() { + return mCredentialEntryTypes; + } + @Nullable public Action getAuthenticationAction(String entryKey) { return mUiAuthenticationEntries.get(entryKey) == null ? null : diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index 0aa080b3c7e6..d4ad65e5b567 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -236,16 +236,26 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan } void getProviderDataAndInitiateUi() { + ArrayList<ProviderData> providerDataList = getProviderDataForUi(); + if (!providerDataList.isEmpty()) { + Log.i(TAG, "provider list not empty about to initiate ui"); + MetricUtilities.logApiCalled(mProviders, ++mSequenceCounter); + launchUiWithProviderData(providerDataList); + } + } + + @NonNull + protected ArrayList<ProviderData> getProviderDataForUi() { Log.i(TAG, "In getProviderDataAndInitiateUi"); Log.i(TAG, "In getProviderDataAndInitiateUi providers size: " + mProviders.size()); + ArrayList<ProviderData> providerDataList = new ArrayList<>(); if (isSessionCancelled()) { MetricUtilities.logApiCalled(mProviders, ++mSequenceCounter); finishSession(/*propagateCancellation=*/true); - return; + return providerDataList; } - ArrayList<ProviderData> providerDataList = new ArrayList<>(); for (ProviderSession session : mProviders.values()) { Log.i(TAG, "preparing data for : " + session.getComponentName()); ProviderData providerData = session.prepareUiData(); @@ -254,11 +264,7 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan providerDataList.add(providerData); } } - if (!providerDataList.isEmpty()) { - Log.i(TAG, "provider list not empty about to initiate ui"); - MetricUtilities.logApiCalled(mProviders, ++mSequenceCounter); - launchUiWithProviderData(providerDataList); - } + return providerDataList; } protected void collectFinalPhaseMetricStatus(boolean hasException, diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 269c4abf537e..2479646e4561 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -475,6 +475,7 @@ import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import com.android.net.module.util.ProxyUtils; import com.android.server.AlarmManagerInternal; +import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; import com.android.server.LockGuard; import com.android.server.PersistentDataBlockManagerInternal; @@ -485,6 +486,7 @@ import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.pm.DefaultCrossProfileIntentFilter; import com.android.server.pm.DefaultCrossProfileIntentFiltersUtils; +import com.android.server.pm.PackageManagerLocal; import com.android.server.pm.RestrictionsSet; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerInternal.UserRestrictionsListener; @@ -1618,6 +1620,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return LocalServices.getService(PackageManagerInternal.class); } + PackageManagerLocal getPackageManagerLocal() { + return LocalManagerRegistry.getManager(PackageManagerLocal.class); + } + ActivityTaskManagerInternal getActivityTaskManagerInternal() { return LocalServices.getService(ActivityTaskManagerInternal.class); } @@ -16354,19 +16360,26 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // The per-Q behavior was to not check the app-ops state. granted = mIPackageManager.checkPermission(permission, packageName, userId); } else { - try { - int uid = mInjector.getPackageManager().getPackageUidAsUser( - packageName, userId); - if (PermissionChecker.checkPermissionForPreflight(mContext, permission, - PermissionChecker.PID_UNKNOWN, uid, packageName) - != PermissionChecker.PERMISSION_GRANTED) { - granted = PackageManager.PERMISSION_DENIED; + try (var snapshot = mInjector.getPackageManagerLocal().withUnfilteredSnapshot()) { + var packageState = snapshot.getPackageStates().get(packageName); + if (packageState == null) { + Slog.w(LOG_TAG, "Can't get permission state for missing package " + + packageName); + return DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT; + } else if (!packageState.getUserStateOrDefault(userId).isInstalled()) { + Slog.w(LOG_TAG, "Can't get permission state for uninstalled package " + + packageName); + return DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT; } else { - granted = PackageManager.PERMISSION_GRANTED; + if (PermissionChecker.checkPermissionForPreflight(mContext, permission, + PermissionChecker.PID_UNKNOWN, + UserHandle.getUid(userId, packageState.getAppId()), packageName) + != PermissionChecker.PERMISSION_GRANTED) { + granted = PackageManager.PERMISSION_DENIED; + } else { + granted = PackageManager.PERMISSION_GRANTED; + } } - } catch (NameNotFoundException e) { - // Package does not exit - return DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT; } } int permFlags = mInjector.getPackageManager().getPermissionFlags( @@ -19344,23 +19357,29 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean isPackageAllowedToAccessCalendarForUser(String packageName, - int userHandle) { + @UserIdInt int userId) { if (!mHasFeature) { return false; } Preconditions.checkStringNotEmpty(packageName, "Package name is null or empty"); - Preconditions.checkArgumentNonnegative(userHandle, "Invalid userId"); + Preconditions.checkArgumentNonnegative(userId, "Invalid userId"); - final CallerIdentity caller = getCallerIdentity(); - final int packageUid = mInjector.binderWithCleanCallingIdentity(() -> { - try { - return mInjector.getPackageManager().getPackageUidAsUser(packageName, userHandle); - } catch (NameNotFoundException e) { - Slogf.w(LOG_TAG, e, - "Couldn't find package %s in user %d", packageName, userHandle); - return -1; + final int packageUid; + try (var snapshot = mInjector.getPackageManagerLocal().withUnfilteredSnapshot()) { + var packageState = snapshot.getPackageStates().get(packageName); + if (packageState == null) { + Slogf.w(LOG_TAG, "Couldn't find package %s in user %d", packageName, + userId); + return false; + } else if (!packageState.getUserStateOrDefault(userId).isInstalled()) { + Slogf.w(LOG_TAG, "Couldn't find installed package %s in user %d", packageName, + userId); + return false; + } else { + packageUid = UserHandle.getUid(userId, packageState.getAppId()); } - }); + } + final CallerIdentity caller = getCallerIdentity(); if (caller.getUid() != packageUid) { Preconditions.checkCallAuthorization( hasCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS) @@ -19369,10 +19388,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (mInjector.settingsSecureGetIntForUser( - Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, 0, userHandle) == 0) { + Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, 0, userId) == 0) { return false; } - final ActiveAdmin admin = getProfileOwnerAdminLocked(userHandle); + final ActiveAdmin admin = getProfileOwnerAdminLocked(userId); if (admin != null) { if (admin.mCrossProfileCalendarPackages == null) { return true; @@ -19726,16 +19745,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } private boolean isCallingFromPackage(String packageName, int callingUid) { - return mInjector.binderWithCleanCallingIdentity(() -> { - try { - final int packageUid = mInjector.getPackageManager().getPackageUidAsUser( - packageName, UserHandle.getUserId(callingUid)); - return packageUid == callingUid; - } catch (NameNotFoundException e) { - Slogf.d(LOG_TAG, "Calling package not found", e); + try (var snapshot = mInjector.getPackageManagerLocal().withUnfilteredSnapshot()) { + var packageState = snapshot.getPackageStates().get(packageName); + var userId = UserHandle.getUserId(callingUid); + if (packageState == null) { + Slogf.d(LOG_TAG, "Calling UID " + callingUid + " not found"); + return false; + } else if (!packageState.getUserStateOrDefault(userId).isInstalled()) { + Slogf.d(LOG_TAG, "Calling UID " + callingUid + " not installed"); return false; + } else { + return callingUid == UserHandle.getUid(userId, packageState.getAppId()); } - }); + } } private DevicePolicyConstants loadConstants() { diff --git a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java index f86e4644d8b9..44ec26ea65e0 100644 --- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java @@ -19,9 +19,11 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_ERRORED; import static android.app.AppOpsManager.OP_COARSE_LOCATION; import static android.app.AppOpsManager.OP_FLAGS_ALL; +import static android.app.AppOpsManager.OP_FLAG_SELF; import static android.app.AppOpsManager.OP_READ_SMS; import static android.app.AppOpsManager.OP_WIFI_SCAN; import static android.app.AppOpsManager.OP_WRITE_SMS; +import static android.os.UserHandle.getUserId; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -33,12 +35,15 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; +import android.app.AppOpsManager; import android.app.AppOpsManager.OpEntry; import android.app.AppOpsManager.PackageOps; import android.content.ContentResolver; @@ -48,14 +53,19 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.provider.Settings; +import android.util.ArrayMap; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.dx.mockito.inline.extended.StaticMockitoSession; +import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; +import com.android.server.pm.PackageManagerLocal; +import com.android.server.pm.UserManagerInternal; import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import org.junit.After; @@ -67,6 +77,7 @@ import org.mockito.quality.Strictness; import java.io.File; import java.util.Collections; import java.util.List; +import java.util.Map; /** * Unit tests for AppOpsService. Covers functionality that is difficult to test using CTS tests @@ -133,6 +144,7 @@ public class AppOpsServiceTest { mMockingSession = mockitoSession() .strictness(Strictness.LENIENT) .spyStatic(LocalServices.class) + .spyStatic(LocalManagerRegistry.class) .spyStatic(Settings.Global.class) .startMocking(); @@ -152,6 +164,23 @@ public class AppOpsServiceTest { doReturn(mockPackageManagerInternal).when( () -> LocalServices.getService(PackageManagerInternal.class)); + PackageManagerLocal mockPackageManagerLocal = mock(PackageManagerLocal.class); + PackageManagerLocal.UnfilteredSnapshot mockUnfilteredSnapshot = + mock(PackageManagerLocal.UnfilteredSnapshot.class); + PackageState mockMyPS = mock(PackageState.class); + ArrayMap<String, PackageState> packageStates = new ArrayMap<>(); + packageStates.put(sMyPackageName, mockMyPS); + when(mockMyPS.getAppId()).thenReturn(mMyUid); + when(mockUnfilteredSnapshot.getPackageStates()).thenReturn(packageStates); + when(mockPackageManagerLocal.withUnfilteredSnapshot()).thenReturn(mockUnfilteredSnapshot); + doReturn(mockPackageManagerLocal).when( + () -> LocalManagerRegistry.getManager(PackageManagerLocal.class)); + + UserManagerInternal mockUserManagerInternal = mock(UserManagerInternal.class); + when(mockUserManagerInternal.getUserIds()).thenReturn(new int[] {getUserId(mMyUid)}); + doReturn(mockUserManagerInternal).when( + () -> LocalServices.getService(UserManagerInternal.class)); + // Mock behavior to use specific Settings.Global.APPOP_HISTORY_PARAMETERS doReturn(null).when(() -> Settings.Global.getString(any(ContentResolver.class), eq(Settings.Global.APPOP_HISTORY_PARAMETERS))); @@ -337,6 +366,25 @@ public class AppOpsServiceTest { assertThat(getLoggedOps()).isNull(); } + @Test + public void testUidStateInitializationDoesntClearState() throws InterruptedException { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, sMyPackageName, MODE_ALLOWED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, sMyPackageName, null, false, null, false); + mAppOpsService.initializeUidStates(); + List<PackageOps> ops = mAppOpsService.getOpsForPackage(mMyUid, sMyPackageName, + new int[]{OP_READ_SMS}); + assertNotNull(ops); + for (int i = 0; i < ops.size(); i++) { + List<OpEntry> opEntries = ops.get(i).getOps(); + for (int j = 0; j < opEntries.size(); j++) { + Map<String, AppOpsManager.AttributedOpEntry> attributedOpEntries = opEntries.get( + j).getAttributedOpEntries(); + assertNotEquals(-1, attributedOpEntries.get(null) + .getLastAccessTime(OP_FLAG_SELF)); + } + } + } + private List<PackageOps> getLoggedOps() { return mAppOpsService.getOpsForPackage(mMyUid, sMyPackageName, null /* all ops */); } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index ba70c584f2de..8f38f25b2f62 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -340,6 +340,50 @@ public class JobSchedulerServiceTest { /** * Confirm that * {@link JobSchedulerService#getRescheduleJobForFailureLocked(JobStatus, int, int)} + * returns a job that is no longer allowed to run as a user-initiated job after it hits + * the cumulative execution limit. + */ + @Test + public void testGetRescheduleJobForFailure_cumulativeExecution() { + JobStatus originalJob = createJobStatus("testGetRescheduleJobForFailure", + createJobInfo() + .setUserInitiated(true) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)); + assertTrue(originalJob.shouldTreatAsUserInitiatedJob()); + + // Cumulative time = 0 + JobStatus rescheduledJob = mService.getRescheduleJobForFailureLocked(originalJob, + JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_UNKNOWN); + assertTrue(rescheduledJob.shouldTreatAsUserInitiatedJob()); + + // Cumulative time = 50% of limit + rescheduledJob.incrementCumulativeExecutionTime( + mService.mConstants.RUNTIME_CUMULATIVE_UI_LIMIT_MS / 2); + rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, + JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_UNKNOWN); + assertTrue(rescheduledJob.shouldTreatAsUserInitiatedJob()); + + // Cumulative time = 99.999999% of limit + rescheduledJob.incrementCumulativeExecutionTime( + mService.mConstants.RUNTIME_CUMULATIVE_UI_LIMIT_MS / 2 - 1); + rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, + JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_UNKNOWN); + assertTrue(rescheduledJob.shouldTreatAsUserInitiatedJob()); + + // Cumulative time = 100+% of limit + rescheduledJob.incrementCumulativeExecutionTime(2); + rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, + JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_UNKNOWN); + assertFalse(rescheduledJob.shouldTreatAsUserInitiatedJob()); + } + + /** + * Confirm that + * {@link JobSchedulerService#getRescheduleJobForFailureLocked(JobStatus, int, int)} * returns a job with the correct delay and deadline constraints. */ @Test diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java index a3ae83428af5..2d8fa1bcd8cd 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java @@ -1318,6 +1318,6 @@ public class ConnectivityControllerTest { private static JobStatus createJobStatus(JobInfo.Builder job, int uid, long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis) { return new JobStatus(job.build(), uid, null, -1, 0, null, null, - earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, 0, 0, null, 0, 0); + earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, 0, 0, 0, null, 0, 0); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java index 4b19bbb72805..7ae6a2d5996d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java @@ -493,21 +493,21 @@ public class FlexibilityControllerTest { JobStatus js = createJobStatus("time", jb); js = new JobStatus( js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 2, /* numSystemStops */ 0, - FROZEN_TIME, FROZEN_TIME); + 0, FROZEN_TIME, FROZEN_TIME); assertEquals(mFcConfig.RESCHEDULED_JOB_DEADLINE_MS, mFlexibilityController.getLifeCycleEndElapsedLocked(js, 0)); js = new JobStatus( js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 2, /* numSystemStops */ 1, - FROZEN_TIME, FROZEN_TIME); + 0, FROZEN_TIME, FROZEN_TIME); assertEquals(2 * mFcConfig.RESCHEDULED_JOB_DEADLINE_MS, mFlexibilityController.getLifeCycleEndElapsedLocked(js, 0)); js = new JobStatus( js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 0, /* numSystemStops */ 10, - FROZEN_TIME, FROZEN_TIME); + 0, FROZEN_TIME, FROZEN_TIME); assertEquals(mFcConfig.MAX_RESCHEDULED_DEADLINE_MS, mFlexibilityController.getLifeCycleEndElapsedLocked(js, 0)); } @@ -662,11 +662,11 @@ public class FlexibilityControllerTest { JobStatus js = createJobStatus("time", jb); js = new JobStatus( js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 1, /* numSystemStops */ 0, - FROZEN_TIME, FROZEN_TIME); + 0, FROZEN_TIME, FROZEN_TIME); assertFalse(js.hasFlexibilityConstraint()); js = new JobStatus( js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 0, /* numSystemStops */ 1, - FROZEN_TIME, FROZEN_TIME); + 0, FROZEN_TIME, FROZEN_TIME); assertFalse(js.hasFlexibilityConstraint()); } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java index b076ab495d0c..df6f9998c326 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java @@ -374,28 +374,28 @@ public class JobStatusTest { int numFailures = 1; int numSystemStops = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); // 2+ failures, priority should be lowered as much as possible. numFailures = 2; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); numFailures = 5; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); numFailures = 8; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); // System stops shouldn't factor in the downgrade. numSystemStops = 10; numFailures = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); } @@ -412,44 +412,44 @@ public class JobStatusTest { int numFailures = 1; int numSystemStops = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); // Failures in [2,4), priority should be lowered slightly. numFailures = 2; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_DEFAULT, job.getEffectivePriority()); numFailures = 3; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_DEFAULT, job.getEffectivePriority()); // Failures in [4,6), priority should be lowered more. numFailures = 4; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); numFailures = 5; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); // 6+ failures, priority should be lowered as much as possible. numFailures = 6; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority()); numFailures = 12; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority()); // System stops shouldn't factor in the downgrade. numSystemStops = 10; numFailures = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); } @@ -470,32 +470,32 @@ public class JobStatusTest { int numFailures = 1; int numSystemStops = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); numFailures = 4; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); numFailures = 5; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); // 6+ failures, priority should be lowered as much as possible. numFailures = 6; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority()); numFailures = 12; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority()); // System stops shouldn't factor in the downgrade. numSystemStops = 10; numFailures = 0; job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, - numSystemStops, 0, 0); + numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); } @@ -515,16 +515,49 @@ public class JobStatusTest { job = createJobStatus(jobInfo); assertTrue(job.shouldTreatAsUserInitiatedJob()); + } + + @Test + public void testShouldTreatAsUserInitiated_userDemoted() { + JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")) + .setUserInitiated(true) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) + .build(); + JobStatus job = createJobStatus(jobInfo); + + assertTrue(job.shouldTreatAsUserInitiatedJob()); JobStatus rescheduledJob = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, - 0, 0, 0, 0); + 0, 0, 0, 0, 0); assertTrue(rescheduledJob.shouldTreatAsUserInitiatedJob()); job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER); assertFalse(job.shouldTreatAsUserInitiatedJob()); rescheduledJob = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, - 0, 0, 0, 0); + 0, 0, 0, 0, 0); + assertFalse(rescheduledJob.shouldTreatAsUserInitiatedJob()); + } + + @Test + public void testShouldTreatAsUserInitiated_systemDemoted() { + JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")) + .setUserInitiated(true) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) + .build(); + JobStatus job = createJobStatus(jobInfo); + + assertTrue(job.shouldTreatAsUserInitiatedJob()); + + JobStatus rescheduledJob = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, + 0, 0, 0, 0, 0); + assertTrue(rescheduledJob.shouldTreatAsUserInitiatedJob()); + + job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ); + assertFalse(job.shouldTreatAsUserInitiatedJob()); + + rescheduledJob = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, + 0, 0, 0, 0, 0); assertFalse(rescheduledJob.shouldTreatAsUserInitiatedJob()); } @@ -1082,7 +1115,7 @@ public class JobStatusTest { final JobInfo job = new JobInfo.Builder(101, new ComponentName("foo", "bar")) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build(); return new JobStatus(job, 0, null, -1, 0, null, null, earliestRunTimeElapsedMillis, - latestRunTimeElapsedMillis, 0, 0, null, 0, 0); + latestRunTimeElapsedMillis, 0, 0, 0, null, 0, 0); } private static JobStatus createJobStatus(JobInfo job) { diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java index a9b68eb8f447..77723d77c121 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java @@ -150,7 +150,7 @@ public class AlarmManagerEconomicPolicyTest { mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES, mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES, @@ -184,7 +184,7 @@ public class AlarmManagerEconomicPolicyTest { when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true); assertEquals(arcToCake(9), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(arcToCake(8), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(arcToCake(7), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app")); } @@ -212,7 +212,7 @@ public class AlarmManagerEconomicPolicyTest { when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app")); diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java index d66e74a812a7..c5fdb6f1cf2e 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java @@ -207,7 +207,7 @@ public class CompleteEconomicPolicyTest { when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true); assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(arcToCake(10), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app")); } diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java index 22c731042e42..d41c93ba2ea9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java @@ -150,7 +150,7 @@ public class JobSchedulerEconomicPolicyTest { mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES, mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES, @@ -201,7 +201,7 @@ public class JobSchedulerEconomicPolicyTest { when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true); assertEquals(arcToCake(6), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(arcToCake(4), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app")); final String pkgUpdater = "com.pkg.updater"; @@ -235,7 +235,7 @@ public class JobSchedulerEconomicPolicyTest { when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted)); final String pkgHeadlessSystemApp = "com.pkg.headless_system_app"; - when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true); + when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp)); assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app")); final String pkgUpdater = "com.pkg.updater"; diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index bbcb376180b7..913d8c1dda20 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -559,7 +559,21 @@ public class MagnificationControllerTest { } @Test - public void onPerformScaleAction_magnifierEnabled_handleScaleChange() throws RemoteException { + public void onPerformScaleAction_fullScreenMagnifierEnabled_handleScaleChange() + throws RemoteException { + final float newScale = 4.0f; + setMagnificationEnabled(MODE_FULLSCREEN); + + mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale); + + verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), eq(newScale), + anyFloat(), anyFloat(), anyBoolean(), anyInt()); + verify(mScreenMagnificationController).persistScale(eq(TEST_DISPLAY)); + } + + @Test + public void onPerformScaleAction_windowMagnifierEnabled_handleScaleChange() + throws RemoteException { final float newScale = 4.0f; setMagnificationEnabled(MODE_WINDOW); @@ -1035,6 +1049,25 @@ public class MagnificationControllerTest { } @Test + public void disableWindowMode_windowEnabled_removeMagnificationSettingsPanel() + throws RemoteException { + setMagnificationEnabled(MODE_WINDOW); + + mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false); + + verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test + public void onFullScreenDeactivated_fullScreenEnabled_removeMagnificationSettingsPanel() + throws RemoteException { + setMagnificationEnabled(MODE_FULLSCREEN); + mScreenMagnificationController.reset(TEST_DISPLAY, /* animate= */ true); + + verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test public void imeWindowStateShown_windowMagnifying_logWindowMode() { MagnificationController spyController = spy(mMagnificationController); spyController.onWindowMagnificationActivationState(TEST_DISPLAY, true); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java index 4b77764c41e5..2357e65871e6 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java @@ -116,6 +116,12 @@ public class WindowMagnificationConnectionWrapperTest { } @Test + public void removeMagnificationSettingsPanel() throws RemoteException { + mConnectionWrapper.removeMagnificationSettingsPanel(TEST_DISPLAY); + verify(mConnection).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test public void setMirrorWindowCallback() throws RemoteException { mConnectionWrapper.setConnectionCallback(mCallback); verify(mConnection).setConnectionCallback(mCallback); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java index d841dfc2d54b..b0fd64976c48 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java @@ -537,6 +537,15 @@ public class WindowMagnificationManagerTest { } @Test + public void removeMagnificationSettingsPanel_hasConnection_invokeConnectionMethod() + throws RemoteException { + mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + + mWindowMagnificationManager.removeMagnificationSettingsPanel(TEST_DISPLAY); + verify(mMockConnection.getConnection()).removeMagnificationSettingsPanel(TEST_DISPLAY); + } + + @Test public void pointersInWindow_magnifierEnabled_returnCorrectValue() throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); 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 7d6110e82139..168642e3533f 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -65,7 +65,6 @@ import android.hardware.biometrics.IBiometricService; import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; -import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.DisplayManagerGlobal; import android.hardware.fingerprint.FingerprintManager; import android.os.Binder; @@ -145,8 +144,6 @@ public class BiometricServiceTest { @Mock private ISessionListener mSessionListener; @Mock - private AmbientDisplayConfiguration mAmbientDisplayConfiguration; - @Mock private AuthSessionCoordinator mAuthSessionCoordinator; BiometricContextProvider mBiometricContextProvider; @@ -184,9 +181,8 @@ public class BiometricServiceTest { when(mWindowManager.getDefaultDisplay()).thenReturn( new Display(DisplayManagerGlobal.getInstance(), Display.DEFAULT_DISPLAY, new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS)); - when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); mBiometricContextProvider = new BiometricContextProvider(mContext, mWindowManager, - mAmbientDisplayConfiguration, mStatusBarService, null /* handler */, + mStatusBarService, null /* handler */, mAuthSessionCoordinator); when(mInjector.getBiometricContext(any())).thenReturn(mBiometricContextProvider); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java index 2ccdda81b755..e4aed975102c 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java @@ -34,7 +34,6 @@ import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.IBiometricContextListener.FoldState; import android.hardware.biometrics.common.OperationContext; import android.hardware.biometrics.common.OperationReason; -import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.DisplayManagerGlobal; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; @@ -77,8 +76,6 @@ public class BiometricContextProviderTest { @Mock private ISessionListener mSessionListener; @Mock - private AmbientDisplayConfiguration mAmbientDisplayConfiguration; - @Mock private WindowManager mWindowManager; private OperationContextExt mOpContext = new OperationContextExt(); @@ -87,12 +84,11 @@ public class BiometricContextProviderTest { @Before public void setup() throws RemoteException { - when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); when(mWindowManager.getDefaultDisplay()).thenReturn( new Display(DisplayManagerGlobal.getInstance(), Display.DEFAULT_DISPLAY, new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS)); mProvider = new BiometricContextProvider(mContext, mWindowManager, - mAmbientDisplayConfiguration, mStatusBarService, null /* handler */, + mStatusBarService, null /* handler */, null /* authSessionCoordinator */); ArgumentCaptor<IBiometricContextListener> captor = ArgumentCaptor.forClass(IBiometricContextListener.class); @@ -106,27 +102,21 @@ public class BiometricContextProviderTest { @Test public void testIsAod() throws RemoteException { - mListener.onDozeChanged(true /* isDozing */, false /* isAwake */); + mListener.onDozeChanged(true /* isAod */, false /* isAwake */); assertThat(mProvider.isAod()).isTrue(); - mListener.onDozeChanged(false /* isDozing */, false /* isAwake */); - assertThat(mProvider.isAod()).isFalse(); - - when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false); - mListener.onDozeChanged(true /* isDozing */, false /* isAwake */); - assertThat(mProvider.isAod()).isFalse(); - mListener.onDozeChanged(false /* isDozing */, false /* isAwake */); + mListener.onDozeChanged(false /* isAod */, false /* isAwake */); assertThat(mProvider.isAod()).isFalse(); } @Test public void testIsAwake() throws RemoteException { - mListener.onDozeChanged(false /* isDozing */, true /* isAwake */); + mListener.onDozeChanged(false /* isAod */, true /* isAwake */); assertThat(mProvider.isAwake()).isTrue(); - mListener.onDozeChanged(false /* isDozing */, false /* isAwake */); + mListener.onDozeChanged(false /* isAod */, false /* isAwake */); assertThat(mProvider.isAwake()).isFalse(); - mListener.onDozeChanged(true /* isDozing */, true /* isAwake */); + mListener.onDozeChanged(true /* isAod */, true /* isAwake */); assertThat(mProvider.isAwake()).isTrue(); - mListener.onDozeChanged(true /* isDozing */, false /* isAwake */); + mListener.onDozeChanged(true /* isAod */, false /* isAwake */); assertThat(mProvider.isAwake()).isFalse(); } diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/SensorControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/SensorControllerTest.java index 1259d7189a6d..aea8b8658984 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/SensorControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/SensorControllerTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; @@ -81,7 +82,8 @@ public class SensorControllerTest { @Test public void createSensor_invalidHandle_throwsException() { doReturn(/* handle= */0).when(mSensorManagerInternalMock).createRuntimeSensor( - anyInt(), anyInt(), anyString(), anyString(), anyInt(), any()); + anyInt(), anyInt(), anyString(), anyString(), anyFloat(), anyFloat(), anyFloat(), + anyInt(), anyInt(), anyInt(), any()); Throwable thrown = assertThrows( RuntimeException.class, @@ -138,7 +140,8 @@ public class SensorControllerTest { private void doCreateSensorSuccessfully() { doReturn(SENSOR_HANDLE).when(mSensorManagerInternalMock).createRuntimeSensor( - anyInt(), anyInt(), anyString(), anyString(), anyInt(), any()); + anyInt(), anyInt(), anyString(), anyString(), anyFloat(), anyFloat(), anyFloat(), + anyInt(), anyInt(), anyInt(), any()); assertThat(mSensorController.createSensor(mSensorToken, mVirtualSensorConfig)) .isEqualTo(SENSOR_HANDLE); } diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index 339ccd80c351..a4a3e363ab4d 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -536,7 +536,8 @@ public class VirtualDeviceManagerServiceTest { .build(); doReturn(SENSOR_HANDLE).when(mSensorManagerInternalMock).createRuntimeSensor( - anyInt(), anyInt(), anyString(), anyString(), anyInt(), any()); + anyInt(), anyInt(), anyString(), anyString(), anyFloat(), anyFloat(), anyFloat(), + anyInt(), anyInt(), anyInt(), any()); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java index f0013a6f98b9..9b32a809d2b5 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java @@ -56,6 +56,7 @@ import com.android.server.AlarmManagerInternal; import com.android.server.LocalServices; import com.android.server.PersistentDataBlockManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.pm.PackageManagerLocal; import com.android.server.pm.UserManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -150,6 +151,11 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override + PackageManagerLocal getPackageManagerLocal() { + return services.packageManagerLocal; + } + + @Override PowerManagerInternal getPowerManagerInternal() { return services.powerManagerInternal; } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 4f74ef8b5f70..dd81abeec5d3 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -1398,8 +1398,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().userManager.getUserRestrictions()).thenReturn(new Bundle()); // Now call clear. - doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(getServices().packageManager). - getPackageUidAsUser(eq(admin1.getPackageName()), anyInt()); + getServices().addTestPackageUid(admin1.getPackageName(), + DpmMockContext.CALLER_SYSTEM_USER_UID); // But first pretend the user is locked. Then it should fail. when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(false); @@ -1495,9 +1495,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; // Now call clear. - doReturn(DpmMockContext.CALLER_UID).when(getServices().packageManager).getPackageUidAsUser( - eq(admin1.getPackageName()), - anyInt()); + getServices().addTestPackageUid(admin1.getPackageName(), DpmMockContext.CALLER_UID); assertExpectException(SecurityException.class, /* messageRegex =*/ "clearDeviceOwner can only be called by the device owner", () -> dpm.clearDeviceOwnerApp(admin1.getPackageName())); @@ -1734,9 +1732,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(userId)); doReturn(true).when(getServices().ipackageManager).isPackageAvailable(packageName, userId); // Setup application UID with the PackageManager - doReturn(uid).when(getServices().packageManager).getPackageUidAsUser( - eq(packageName), - eq(userId)); + getServices().addTestPackageUid(packageName, uid); // Associate packageName to uid doReturn(packageName).when(getServices().ipackageManager).getNameForUid(eq(uid)); doReturn(new String[]{packageName}) @@ -3955,9 +3951,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertThat(dpms.hasUserSetupCompleted()).isFalse(); } - private void clearDeviceOwner() throws Exception { - doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(getServices().packageManager) - .getPackageUidAsUser(eq(admin1.getPackageName()), anyInt()); + private void clearDeviceOwner() { + getServices().addTestPackageUid(admin1.getPackageName(), + DpmMockContext.CALLER_SYSTEM_USER_UID); mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; runAsCaller(mAdmin1Context, dpms, dpm -> { @@ -6321,7 +6317,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_UID; setAsProfileOwner(admin1); - final DpmMockContext caller = new DpmMockContext(getServices(), mRealTestContext); + var caller = new DpmMockContext(getServices(), mRealTestContext); caller.packageName = "com.example.delegate"; caller.binder.callingUid = setupPackageInPackageManager(caller.packageName, CALLER_USER_HANDLE, 20988, ApplicationInfo.FLAG_HAS_CODE); @@ -6965,6 +6961,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { @Test public void testIsPackageAllowedToAccessCalendar_adminNotAllowed() { + final String testPackage = "TEST_PACKAGE"; setAsProfileOwner(admin1); dpm.setCrossProfileCalendarPackages(admin1, Collections.emptySet()); when(getServices().settings.settingsSecureGetIntForUser( @@ -6972,7 +6969,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { 0, CALLER_USER_HANDLE)).thenReturn(1); mContext.permissions.add(permission.INTERACT_ACROSS_USERS); - assertThat(dpm.isPackageAllowedToAccessCalendar("TEST_PACKAGE")).isFalse(); + assertThat(dpm.isPackageAllowedToAccessCalendar(testPackage)).isFalse(); } @Test @@ -6991,6 +6988,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { @Test public void testIsPackageAllowedToAccessCalendar_bothAllowed() { final String testPackage = "TEST_PACKAGE"; + getServices().addTestPackageUid(testPackage, DpmMockContext.ANOTHER_UID); setAsProfileOwner(admin1); dpm.setCrossProfileCalendarPackages(admin1, null); when(getServices().settings.settingsSecureGetIntForUser( @@ -7004,24 +7002,22 @@ public class DevicePolicyManagerTest extends DpmTestBase { @Test public void testIsPackageAllowedToAccessCalendar_requiresPermission() { final String testPackage = "TEST_PACKAGE"; + getServices().addTestPackageUid(testPackage, DpmMockContext.ANOTHER_UID); assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpm.isPackageAllowedToAccessCalendar(testPackage)); } @Test - public void testIsPackageAllowedToAccessCalendar_samePackageAndSameUser_noPermissionRequired() - throws Exception { + public void testIsPackageAllowedToAccessCalendar_samePackageAndSameUser_noPermissionRequired() { final String testPackage = "TEST_PACKAGE"; setAsProfileOwner(admin1); dpm.setCrossProfileCalendarPackages(admin1, null); when(getServices().settings.settingsSecureGetIntForUser( Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, 0, CALLER_USER_HANDLE)).thenReturn(1); - doReturn(mContext.binder.callingUid) - .when(getServices().packageManager).getPackageUidAsUser( - eq(testPackage), - anyInt()); + + getServices().addTestPackageUid(testPackage, mContext.binder.callingUid); assertThat(dpm.isPackageAllowedToAccessCalendar(testPackage)).isTrue(); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index ded8ad595645..9ff600a6d0f8 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -171,10 +171,15 @@ public class DpmMockContext extends MockContext { public ApplicationInfo applicationInfo = null; public DpmMockContext(MockSystemServices mockSystemServices, Context context) { + this(mockSystemServices, context, new MockBinder()); + } + + public DpmMockContext(MockSystemServices mockSystemServices, Context context, + @NonNull MockBinder mockBinder) { mMockSystemServices = mockSystemServices; realTestContext = context; + binder = mockBinder; - binder = new MockBinder(); resources = mock(Resources.class); spiedContext = mock(Context.class); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java index b8824c3d8268..03aaeb7e0db8 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java @@ -67,8 +67,9 @@ public abstract class DpmTestBase { @Before public void setFixtures() throws Exception { - mServices = new MockSystemServices(mRealTestContext, "test-data"); - mMockContext = new DpmMockContext(mServices, mRealTestContext); + var mockBinder = new DpmMockContext.MockBinder(); + mServices = new MockSystemServices(mRealTestContext, "test-data", mockBinder); + mMockContext = new DpmMockContext(mServices, mRealTestContext, mockBinder); admin1 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin1.class); admin2 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin2.class); @@ -150,7 +151,7 @@ public abstract class DpmTestBase { doReturn(pi).when(mServices.ipackageManager).getPackageInfo(packageName, 0, userId); - doReturn(ai.uid).when(mServices.packageManager).getPackageUidAsUser(packageName, userId); + mServices.addTestPackageUid(packageName, ai.uid); } protected void markDelegatedCertInstallerAsInstalled() throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java index 4163f33e94e9..16fdfb16444a 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.accounts.Account; import android.accounts.AccountManager; +import android.annotation.NonNull; import android.app.ActivityManagerInternal; import android.app.AlarmManager; import android.app.AppOpsManager; @@ -55,6 +56,7 @@ import android.net.IIpConnectivityMetrics; import android.net.Uri; import android.net.VpnManager; import android.net.wifi.WifiManager; +import android.os.Binder; import android.os.Handler; import android.os.PowerManager; import android.os.PowerManagerInternal; @@ -77,7 +79,10 @@ import com.android.internal.widget.LockSettingsInternal; import com.android.server.AlarmManagerInternal; import com.android.server.PersistentDataBlockManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.pm.PackageManagerLocal; import com.android.server.pm.UserManagerInternal; +import com.android.server.pm.pkg.PackageState; +import com.android.server.pm.pkg.PackageUserState; import com.android.server.wm.ActivityTaskManagerInternal; import java.io.File; @@ -101,6 +106,7 @@ public class MockSystemServices { public final UsageStatsManagerInternal usageStatsManagerInternal; public final NetworkPolicyManagerInternal networkPolicyManagerInternal; public final PackageManagerInternal packageManagerInternal; + public final PackageManagerLocal packageManagerLocal; public final UserManagerForMock userManagerForMock; public final PowerManagerForMock powerManager; public final PowerManagerInternal powerManagerInternal; @@ -143,7 +149,10 @@ public class MockSystemServices { public final File dataDir; public final PolicyPathProvider pathProvider; - public MockSystemServices(Context realContext, String name) { + private final Map<String, PackageState> mTestPackageStates = new ArrayMap<>(); + + public MockSystemServices(Context realContext, String name, + @NonNull DpmMockContext.MockBinder mockBinder) { dataDir = new File(realContext.getCacheDir(), name); DpmTestUtils.clearDir(dataDir); @@ -157,6 +166,7 @@ public class MockSystemServices { userManagerForMock = mock(UserManagerForMock.class); packageManagerInternal = mock(PackageManagerInternal.class); + packageManagerLocal = mock(PackageManagerLocal.class); powerManager = mock(PowerManagerForMock.class); powerManagerInternal = mock(PowerManagerInternal.class); recoverySystem = mock(RecoverySystemForMock.class); @@ -197,6 +207,14 @@ public class MockSystemServices { when(packageManagerInternal.getSystemUiServiceComponent()).thenReturn( new ComponentName("com.android.systemui", ".Service")); + addTestPackageUid("android", DpmMockContext.SYSTEM_UID); + addTestPackageUid(realContext.getPackageName(), Binder.getCallingUid()); + when(packageManagerLocal.withUnfilteredSnapshot()).thenAnswer(unused -> { + var snapshot = mock(PackageManagerLocal.UnfilteredSnapshot.class); + when(snapshot.getPackageStates()).thenAnswer(unused1 -> mTestPackageStates); + return snapshot; + }); + contentResolver = new MockContentResolver(); contentResolver.addProvider("telephony", new MockContentProvider(realContext) { @Override @@ -409,6 +427,16 @@ public class MockSystemServices { throw new UnsupportedOperationException("No package " + packageName + " for user " + user); } + public void addTestPackageUid(@NonNull String packageName, int uid) { + var packageState = mock(PackageState.class); + when(packageState.getAppId()).thenReturn(UserHandle.getAppId(uid)); + when(packageState.getUserStateOrDefault(anyInt())).thenAnswer(invocation -> { + var userState = mock(PackageUserState.class); + when(userState.isInstalled()).thenReturn(true); + return userState; + }); + mTestPackageStates.put(packageName, packageState); + } public static class EnvironmentForMock { public File getUserSystemDirectory(int userId) { diff --git a/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java b/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java index 56d01b0e3a2a..5e7dc33a1e52 100644 --- a/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java +++ b/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java @@ -21,6 +21,7 @@ import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; +import android.os.DeviceIdleManager; import android.test.AndroidTestCase; import com.android.server.job.MockBiasJobService.TestEnvironment; @@ -48,6 +49,7 @@ public class BiasSchedulingTest extends AndroidTestCase { sJobServiceComponent = new ComponentName(getContext(), MockBiasJobService.class); mJobScheduler = (JobScheduler) getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE); mJobScheduler.cancelAll(); + getContext().getSystemService(DeviceIdleManager.class).endIdle("BiasSchedulingTest"); } @Override diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java index 236c74fc29e6..6bfd93b66f61 100644 --- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java +++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java @@ -478,6 +478,7 @@ public class JobStoreTest { 0 /* sourceUserId */, 0, "someNamespace", "someTag", invalidEarlyRuntimeElapsedMillis, invalidLateRuntimeElapsedMillis, 0 /* lastSuccessfulRunTime */, 0 /* lastFailedRunTime */, + 0 /* cumulativeExecutionTime */, persistedExecutionTimesUTC, 0 /* innerFlag */, 0 /* dynamicConstraints */); mTaskStoreUnderTest.add(js); @@ -515,6 +516,21 @@ public class JobStoreTest { } @Test + public void testCumulativeExecutionTimePersisted() throws Exception { + JobInfo ji = new Builder(53, mComponent).setPersisted(true).build(); + final JobStatus js = JobStatus.createFromJobInfo(ji, SOME_UID, null, -1, null, null); + js.incrementCumulativeExecutionTime(1234567890); + mTaskStoreUnderTest.add(js); + waitForPendingIo(); + + final JobSet jobStatusSet = new JobSet(); + mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet, true); + JobStatus loaded = jobStatusSet.getAllJobs().iterator().next(); + assertEquals("Cumulative execution time not correctly persisted.", + 1234567890, loaded.getCumulativeExecutionTimeMs()); + } + + @Test public void testNamespacePersisted() throws Exception { final String namespace = "my.test.namespace"; JobInfo.Builder b = new Builder(93, mComponent) @@ -853,6 +869,9 @@ public class JobStoreTest { compareTimestampsSubjectToIoLatency("Late run-times not the same after read.", expected.getLatestRunTimeElapsed(), actual.getLatestRunTimeElapsed()); + assertEquals(expected.getCumulativeExecutionTimeMs(), + actual.getCumulativeExecutionTimeMs()); + assertEquals(expected.hasWorkLocked(), actual.hasWorkLocked()); if (expected.hasWorkLocked()) { List<JobWorkItem> allWork = new ArrayList<>(); diff --git a/services/tests/servicestests/src/com/android/server/pm/BackgroundInstallControlServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/BackgroundInstallControlServiceTest.java index ccf530f98b4d..ba91647f96ed 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BackgroundInstallControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BackgroundInstallControlServiceTest.java @@ -719,8 +719,60 @@ public final class BackgroundInstallControlServiceTest { public void testHandleUsageEvent_packageAddedThroughAdb() throws NoSuchFieldException, PackageManager.NameNotFoundException { assertNull(mBackgroundInstallControlService.getBackgroundInstalledPackages()); + // This test is a duplicate of testHandleUsageEvent_packageAddedThroughAdb except the + // initiatingPackageName used to be null but is now "com.android.shell". This test ensures + // that the behavior is still the same for when the initiatingPackageName is null. InstallSourceInfo installSourceInfo = new InstallSourceInfo( - /* initiatingPackageName = */ null, //currently ADB installer sets field to null + /* initiatingPackageName = */ null, + /* initiatingPackageSigningInfo = */ null, + /* originatingPackageName = */ null, + /* installingPackageName = */ INSTALLER_NAME_1); + // b/265203007 + when(mPackageManager.getInstallSourceInfo(anyString())).thenReturn(installSourceInfo); + ApplicationInfo appInfo = mock(ApplicationInfo.class); + + when(mPackageManager.getApplicationInfoAsUser( + eq(PACKAGE_NAME_1), + any(), + anyInt()) + ).thenReturn(appInfo); + + long createTimestamp = PACKAGE_ADD_TIMESTAMP_1 + - (System.currentTimeMillis() - SystemClock.uptimeMillis()); + FieldSetter.setField(appInfo, + ApplicationInfo.class.getDeclaredField("createTimestamp"), + createTimestamp); + + int uid = USER_ID_1 * UserHandle.PER_USER_RANGE; + assertEquals(USER_ID_1, UserHandle.getUserId(uid)); + + // The following usage events generation is the same as + // testHandleUsageEvent_packageAddedOutsideTimeFrame2 test. The only difference is that + // for ADB installs the initiatingPackageName used to be null, despite being detected + // as a background install. Since we do not want to treat side-loaded apps as background + // install getBackgroundInstalledPackages() is expected to return null + doReturn(PackageManager.PERMISSION_GRANTED).when(mPermissionManager).checkPermission( + anyString(), anyString(), anyInt()); + generateUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, + USER_ID_1, INSTALLER_NAME_1, USAGE_EVENT_TIMESTAMP_2); + generateUsageEvent(Event.ACTIVITY_STOPPED, + USER_ID_1, INSTALLER_NAME_1, USAGE_EVENT_TIMESTAMP_3); + + mPackageListObserver.onPackageAdded(PACKAGE_NAME_1, uid); + mTestLooper.dispatchAll(); + + var packages = mBackgroundInstallControlService.getBackgroundInstalledPackages(); + assertNull(packages); + } + @Test + public void testHandleUsageEvent_packageAddedThroughAdb2() throws + NoSuchFieldException, PackageManager.NameNotFoundException { + assertNull(mBackgroundInstallControlService.getBackgroundInstalledPackages()); + // This test is a duplicate of testHandleUsageEvent_packageAddedThroughAdb except the + // initiatingPackageName used to be null but is now "com.android.shell". This test ensures + // that the behavior is still the same after this change. + InstallSourceInfo installSourceInfo = new InstallSourceInfo( + /* initiatingPackageName = */ "com.android.shell", /* initiatingPackageSigningInfo = */ null, /* originatingPackageName = */ null, /* installingPackageName = */ INSTALLER_NAME_1); @@ -745,9 +797,9 @@ public final class BackgroundInstallControlServiceTest { // The following usage events generation is the same as // testHandleUsageEvent_packageAddedOutsideTimeFrame2 test. The only difference is that - // for ADB installs the initiatingPackageName is null, despite being detected as a - // background install. Since we do not want to treat side-loaded apps as background install - // getBackgroundInstalledPackages() is expected to return null + // for ADB installs the initiatingPackageName is com.android.shell, despite being detected + // as a background install. Since we do not want to treat side-loaded apps as background + // install getBackgroundInstalledPackages() is expected to return null doReturn(PackageManager.PERMISSION_GRANTED).when(mPermissionManager).checkPermission( anyString(), anyString(), anyInt()); generateUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java index 6f6e22428eb4..bf836ae0eba0 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java @@ -884,18 +884,21 @@ public class ZenModeHelperTest extends UiServiceTestCase { @Test public void testProto() { mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS; + // existence of manual rule means it should be in output mZenModeHelperSpy.mConfig.manualRule = new ZenModeConfig.ZenRule(); + mZenModeHelperSpy.mConfig.manualRule.pkg = "android"; // system int n = mZenModeHelperSpy.mConfig.automaticRules.size(); List<String> ids = new ArrayList<>(n); for (ZenModeConfig.ZenRule rule : mZenModeHelperSpy.mConfig.automaticRules.values()) { ids.add(rule.id); } - ids.add(""); + ids.add(ZenModeConfig.MANUAL_RULE_ID); + ids.add(""); // for ROOT_CONFIG, logged with empty string as id List<StatsEvent> events = new LinkedList<>(); mZenModeHelperSpy.pullRules(events); - assertEquals(n + 1, events.size()); + assertEquals(n + 2, events.size()); // automatic rules + manual rule + root config for (WrappedSysUiStatsEvent.WrappedBuilder builder : mStatsEventBuilderFactory.builders) { if (builder.getAtomId() == DND_MODE_RULE) { if (builder.getInt(ZEN_MODE_FIELD_NUMBER) == ROOT_CONFIG) { @@ -1002,7 +1005,6 @@ public class ZenModeHelperTest extends UiServiceTestCase { mZenModeHelperSpy.mConfig.automaticRules = getCustomAutomaticRules(); mZenModeHelperSpy.mConfig.manualRule = new ZenModeConfig.ZenRule(); mZenModeHelperSpy.mConfig.manualRule.enabled = true; - mZenModeHelperSpy.mConfig.manualRule.enabler = "com.enabler"; List<StatsEvent> events = new LinkedList<>(); mZenModeHelperSpy.pullRules(events); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 1a635a9e589f..b8a21ec4c030 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -45,6 +45,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static android.content.res.Configuration.UI_MODE_TYPE_DESK; import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS; import static android.os.Process.NOBODY_UID; import static android.view.Display.DEFAULT_DISPLAY; @@ -491,6 +492,62 @@ public class ActivityRecordTests extends WindowTestsBase { } @Test + public void testDeskModeChange_doesNotRelaunch() throws RemoteException { + mWm.mSkipActivityRelaunchWhenDocking = true; + + final ActivityRecord activity = createActivityWithTask(); + // The activity will already be relaunching out of the gate, finish the relaunch so we can + // test properly. + activity.finishRelaunching(); + // Clear out any calls to scheduleTransaction from launching the activity. + reset(mAtm.getLifecycleManager()); + + final Task task = activity.getTask(); + activity.setState(RESUMED, "Testing"); + + // Send a desk UI mode config update. + final Configuration newConfig = new Configuration(task.getConfiguration()); + newConfig.uiMode |= UI_MODE_TYPE_DESK; + task.onRequestedOverrideConfigurationChanged(newConfig); + ensureActivityConfiguration(activity); + + // The activity shouldn't start relaunching since it doesn't have any desk resources. + assertFalse(activity.isRelaunching()); + + // The configuration change is still sent to the activity, even if it doesn't relaunch. + final ActivityConfigurationChangeItem expected = + ActivityConfigurationChangeItem.obtain(newConfig); + verify(mAtm.getLifecycleManager()).scheduleTransaction( + eq(activity.app.getThread()), eq(activity.token), eq(expected)); + } + + @Test + public void testDeskModeChange_relaunchesWithDeskResources() { + mWm.mSkipActivityRelaunchWhenDocking = true; + + final ActivityRecord activity = createActivityWithTask(); + // The activity will already be relaunching out of the gate, finish the relaunch so we can + // test properly. + activity.finishRelaunching(); + + // Activities with desk resources should get relaunched when a UI_MODE_TYPE_DESK change + // comes in. + doReturn(true).when(activity).hasDeskResources(); + + final Task task = activity.getTask(); + activity.setState(RESUMED, "Testing"); + + // Send a desk UI mode config update. + final Configuration newConfig = new Configuration(task.getConfiguration()); + newConfig.uiMode |= UI_MODE_TYPE_DESK; + task.onRequestedOverrideConfigurationChanged(newConfig); + ensureActivityConfiguration(activity); + + // The activity will relaunch since it has desk resources. + assertTrue(activity.isRelaunching()); + } + + @Test public void testSetRequestedOrientationUpdatesConfiguration() throws Exception { final ActivityRecord activity = new ActivityBuilder(mAtm) .setCreateTask(true) diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java index 146ed34204f5..226ecf421928 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java @@ -792,7 +792,7 @@ public class DisplayRotationTests { // ... until half-fold mTarget.foldStateChanged(DeviceStateController.DeviceState.HALF_FOLDED); assertTrue(waitForUiHandler()); - verify(sMockWm).updateRotation(false, false); + verify(sMockWm).updateRotation(anyBoolean(), anyBoolean()); assertTrue(waitForUiHandler()); assertEquals(Surface.ROTATION_0, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); @@ -800,7 +800,7 @@ public class DisplayRotationTests { // ... then transition back to flat mTarget.foldStateChanged(DeviceStateController.DeviceState.OPEN); assertTrue(waitForUiHandler()); - verify(sMockWm, atLeast(1)).updateRotation(false, false); + verify(sMockWm, atLeast(1)).updateRotation(anyBoolean(), anyBoolean()); assertTrue(waitForUiHandler()); assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 9b4cb134e427..12e4825e5f85 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FOR import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS; +import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA; @@ -46,6 +47,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.wm.LetterboxUiController.MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; +import static com.android.server.wm.LetterboxUiController.SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -186,6 +189,69 @@ public class LetterboxUiControllerTest extends WindowTestsBase { } @Test + public void testShouldIgnoreOrientationRequestLoop_overrideDisabled_returnsFalse() { + doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio(); + // Request 3 times to simulate orientation request loop + for (int i = 0; i <= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) { + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false, + /* expectedCount */ 0); + } + } + + @Test + @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED}) + public void testShouldIgnoreOrientationRequestLoop_isLetterboxed_returnsFalse() { + doReturn(true).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio(); + // Request 3 times to simulate orientation request loop + for (int i = 0; i <= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) { + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false, + /* expectedCount */ i); + } + } + + @Test + @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED}) + public void testShouldIgnoreOrientationRequestLoop_noLoop_returnsFalse() { + doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio(); + // No orientation request loop + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false, + /* expectedCount */ 0); + } + + @Test + @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED}) + public void testShouldIgnoreOrientationRequestLoop_timeout_returnsFalse() + throws InterruptedException { + doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio(); + for (int i = MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i > 0; i--) { + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false, + /* expectedCount */ 0); + Thread.sleep(SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS); + } + } + + @Test + @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED}) + public void testShouldIgnoreOrientationRequestLoop_returnsTrue() { + doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio(); + for (int i = 0; i < MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) { + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false, + /* expectedCount */ i); + } + assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ true, + /* expectedCount */ MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP); + } + + private void assertShouldIgnoreOrientationRequestLoop(boolean shouldIgnore, int expectedCount) { + if (shouldIgnore) { + assertTrue(mController.shouldIgnoreOrientationRequestLoop()); + } else { + assertFalse(mController.shouldIgnoreOrientationRequestLoop()); + } + assertEquals(expectedCount, mController.getSetOrientationRequestCounter()); + } + + @Test @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH}) public void testShouldIgnoreRequestedOrientation_flagIsDisabled_returnsFalse() { prepareActivityThatShouldIgnoreRequestedOrientationDuringRelaunch(); @@ -760,6 +826,33 @@ public class LetterboxUiControllerTest extends WindowTestsBase { assertTrue(mController.shouldSendFakeFocus()); } + @Test + public void testgetFixedOrientationLetterboxAspectRatio_splitScreenAspectEnabled() { + doReturn(true).when(mActivity.mWmService.mLetterboxConfiguration) + .isCameraCompatTreatmentEnabled(anyBoolean()); + doReturn(true).when(mActivity.mWmService.mLetterboxConfiguration) + .isCameraCompatSplitScreenAspectRatioEnabled(); + doReturn(false).when(mActivity.mWmService.mLetterboxConfiguration) + .getIsDisplayAspectRatioEnabledForFixedOrientationLetterbox(); + doReturn(1.5f).when(mActivity.mWmService.mLetterboxConfiguration) + .getFixedOrientationLetterboxAspectRatio(); + + // Recreate DisplayContent with DisplayRotationCompatPolicy + mActivity = setUpActivityWithComponent(); + mController = new LetterboxUiController(mWm, mActivity); + + assertEquals(mController.getFixedOrientationLetterboxAspectRatio( + mActivity.getParent().getConfiguration()), 1.5f, /* delta */ 0.01); + + spyOn(mDisplayContent.mDisplayRotationCompatPolicy); + doReturn(true).when(mDisplayContent.mDisplayRotationCompatPolicy) + .isTreatmentEnabledForActivity(eq(mActivity)); + + assertEquals(mController.getFixedOrientationLetterboxAspectRatio( + mActivity.getParent().getConfiguration()), mController.getSplitScreenAspectRatio(), + /* delta */ 0.01); + } + private void mockThatProperty(String propertyName, boolean value) throws Exception { Property property = new Property(propertyName, /* value */ value, /* packageName */ "", /* className */ ""); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 12f9a9ee0ea6..9ebc7307418d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -1032,6 +1032,17 @@ public class RecentTasksTest extends WindowTestsBase { fail("Expected com.android.pkg1 tasks to be removed"); } } + + // If the task has a non-stopped activity, the removal will wait for its onDestroy. + final Task task = tasks.get(0); + final ActivityRecord top = new ActivityBuilder(mAtm).setTask(task).build(); + top.lastVisibleTime = 123; + top.setState(ActivityRecord.State.RESUMED, "test"); + mRecentTasks.removeTasksByPackageName(task.getBasePackageName(), TEST_USER_0_ID); + assertTrue(task.mKillProcessesOnDestroyed); + top.setState(ActivityRecord.State.DESTROYING, "test"); + top.destroyed("test"); + assertFalse(task.mKillProcessesOnDestroyed); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index e4a591ea4fe2..de41117c001d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -52,11 +52,13 @@ import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANG import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; +import static com.android.server.wm.ActivityRecord.State.DESTROYED; import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STOPPED; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; +import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.google.common.truth.Truth.assertThat; @@ -64,6 +66,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -174,6 +178,26 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testCleanLetterboxConfigListenerWhenTranslucentIsDestroyed() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2000, 1000); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Translucent Activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) + .build(); + doReturn(false).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + + translucentActivity.setState(DESTROYED, "testing"); + translucentActivity.removeImmediately(); + + assertFalse(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior()); + } + + @Test public void testHorizontalReachabilityEnabledForTranslucentActivities() { setUpDisplaySizeWithApp(2500, 1000); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -507,6 +531,33 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testTranslucentActivity_clearSizeCompatMode_inheritedCompatDisplayInsetsCleared() { + mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); + setUpDisplaySizeWithApp(2800, 1400); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + prepareUnresizable(mActivity, -1f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + // Rotate to put activity in size compat mode. + rotateDisplay(mActivity.mDisplayContent, ROTATION_90); + assertTrue(mActivity.inSizeCompatMode()); + + // We launch a transparent activity + final ActivityRecord translucentActivity = new ActivityBuilder(mAtm) + .setLaunchedFromUid(mActivity.getUid()) + .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) + .build(); + doReturn(false).when(translucentActivity).fillsParent(); + mTask.addChild(translucentActivity); + + // The transparent activity inherits the compat display insets of the opaque activity + // beneath it + assertNotNull(translucentActivity.getCompatDisplayInsets()); + + // Clearing SCM should also clear the inherited compat display insets + translucentActivity.clearSizeCompatMode(); + assertNull(translucentActivity.getCompatDisplayInsets()); + } + + @Test public void testRestartProcessIfVisible() { setUpDisplaySizeWithApp(1000, 2500); doNothing().when(mSupervisor).scheduleRestartTimeout(mActivity); @@ -3755,6 +3806,27 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testGetFixedOrientationLetterboxAspectRatio_tabletop_centered() { + // Set up a display in portrait with a fixed-orientation LANDSCAPE app + setUpDisplaySizeWithApp(1400, 2800); + mWm.mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier( + LETTERBOX_POSITION_MULTIPLIER_CENTER); + mActivity.mWmService.mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier( + 1.0f /*letterboxVerticalPositionMultiplier*/); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); + + setFoldablePosture(true /* isHalfFolded */, true /* isTabletop */); + + Configuration parentConfig = mActivity.getParent().getConfiguration(); + + float actual = mActivity.mLetterboxUiController + .getFixedOrientationLetterboxAspectRatio(parentConfig); + float expected = mActivity.mLetterboxUiController.getSplitScreenAspectRatio(); + + assertEquals(expected, actual, 0.01); + } + + @Test public void testUpdateResolvedBoundsHorizontalPosition_bookModeEnabled() { // Set up a display in landscape with a fixed-orientation PORTRAIT app setUpDisplaySizeWithApp(2800, 1400); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 582d7d81cd4a..d7bf4b0e02b2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -1415,6 +1415,8 @@ public class TransitionTests extends WindowTestsBase { final Transition.ChangeInfo activity1ChangeInfo = closeTransition.mChanges.get(activity1); assertNotNull(activity1ChangeInfo); assertTrue(activity1ChangeInfo.hasChanged()); + // No need to wait for the activity in transient hide task. + assertTrue(activity1.isSyncFinished()); activity1.setVisibleRequested(false); activity2.setVisibleRequested(true); diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeHalFactory.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeHalFactory.java new file mode 100644 index 000000000000..badda8e22ff0 --- /dev/null +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeHalFactory.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.soundtrigger_middleware; + +import android.media.soundtrigger_middleware.IInjectGlobalEvent; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; +import com.android.server.soundtrigger_middleware.FakeSoundTriggerHal.ExecutorHolder; + + +/** + * Alternate HAL factory which constructs {@link FakeSoundTriggerHal} with addition hooks to + * observe framework events. + */ +class FakeHalFactory implements HalFactory { + + private static final String TAG = "FakeHalFactory"; + private final ISoundTriggerInjection mInjection; + + FakeHalFactory(ISoundTriggerInjection injection) { + mInjection = injection; + } + + /** + * We override the methods below at the {@link ISoundTriggerHal} level, because + * they do not represent real HAL events, rather, they are framework exclusive. + * So, we intercept them here and report them to the injection interface. + */ + @Override + public ISoundTriggerHal create() { + final FakeSoundTriggerHal hal = new FakeSoundTriggerHal(mInjection); + final IInjectGlobalEvent session = hal.getGlobalEventInjection(); + // The fake hal is a ST3 HAL implementation. + final ISoundTriggerHal wrapper = new SoundTriggerHw3Compat(hal, + /* reboot runnable */ () -> { + try { + session.triggerRestart(); + } + catch (RemoteException e) { + Slog.wtf(TAG, "Unexpected RemoteException from same process"); + } + }) { + @Override + public void detach() { + ExecutorHolder.INJECTION_EXECUTOR.execute(() -> { + try { + mInjection.onFrameworkDetached(session); + } catch (RemoteException e) { + Slog.wtf(TAG, "Unexpected RemoteException from same process"); + } + }); + } + + @Override + public void clientAttached(IBinder token) { + ExecutorHolder.INJECTION_EXECUTOR.execute(() -> { + try { + mInjection.onClientAttached(token, session); + } catch (RemoteException e) { + Slog.wtf(TAG, "Unexpected RemoteException from same process"); + } + }); + } + + @Override + public void clientDetached(IBinder token) { + ExecutorHolder.INJECTION_EXECUTOR.execute(() -> { + try { + mInjection.onClientDetached(token); + } catch (RemoteException e) { + Slog.wtf(TAG, "Unexpected RemoteException from same process"); + } + }); + } + }; + return wrapper; + } +} diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java new file mode 100644 index 000000000000..86c4bbfe56b8 --- /dev/null +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java @@ -0,0 +1,712 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.soundtrigger_middleware; + +import android.annotation.Nullable; +import android.hardware.soundtrigger3.ISoundTriggerHw; +import android.hardware.soundtrigger3.ISoundTriggerHwCallback; +import android.hardware.soundtrigger3.ISoundTriggerHwGlobalCallback; +import android.media.soundtrigger.ModelParameter; +import android.media.soundtrigger.ModelParameterRange; +import android.media.soundtrigger.PhraseRecognitionEvent; +import android.media.soundtrigger.PhraseRecognitionExtra; +import android.media.soundtrigger.PhraseSoundModel; +import android.media.soundtrigger.Properties; +import android.media.soundtrigger.RecognitionConfig; +import android.media.soundtrigger.RecognitionEvent; +import android.media.soundtrigger.RecognitionMode; +import android.media.soundtrigger.RecognitionStatus; +import android.media.soundtrigger.SoundModel; +import android.media.soundtrigger.SoundModelType; +import android.media.soundtrigger.Status; +import android.media.soundtrigger_middleware.IAcknowledgeEvent; +import android.media.soundtrigger_middleware.IInjectGlobalEvent; +import android.media.soundtrigger_middleware.IInjectModelEvent; +import android.media.soundtrigger_middleware.IInjectRecognitionEvent; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; +import android.os.DeadObjectException; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; +import android.os.ServiceSpecificException; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.FunctionalUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + + +/** + * Fake HAL implementation, which offers injection via + * {@link ISoundTriggerInjection}. + * Since this is a test interface, upon unexpected operations from the framework, + * we will abort. + */ +public class FakeSoundTriggerHal extends ISoundTriggerHw.Stub { + private static final String TAG = "FakeSoundTriggerHal"; + + // Fake values for valid model param range + private static final int THRESHOLD_MIN = -10; + private static final int THRESHOLD_MAX = 10; + + // Logically const + private final Object mLock = new Object(); + private final Properties mProperties; + + // These cannot be injected, since we rely on: + // 1) Serialization + // 2) Running in a different thread + // And there is no Executor interface with these requirements + // These factories clean up the pools on finalizer. + // Package private so the FakeHalFactory can dispatch + static class ExecutorHolder { + static final Executor CALLBACK_EXECUTOR = + Executors.newSingleThreadExecutor(); + static final Executor INJECTION_EXECUTOR = + Executors.newSingleThreadExecutor(); + } + + // Dispatcher interface for callbacks, using the executors above + private final InjectionDispatcher mInjectionDispatcher; + + // Created on construction, passed back to clients. + private final IInjectGlobalEvent.Stub mGlobalEventSession; + + @GuardedBy("mLock") + private IBinder.DeathRecipient mDeathRecipient; + + @GuardedBy("mLock") + private GlobalCallbackDispatcher mGlobalCallbackDispatcher = null; + + @GuardedBy("mLock") + private boolean mIsResourceContended = false; + @GuardedBy("mLock") + private final Map<Integer, ModelSession> mModelSessionMap = new HashMap<>(); + + // Current version of the STHAL relies on integer model session ids. + // Generate them monotonically starting at 101 + @GuardedBy("mLock") + private int mModelKeyCounter = 101; + + @GuardedBy("mLock") + private boolean mIsDead = false; + + private class ModelSession extends IInjectModelEvent.Stub { + // Logically const + private final boolean mIsKeyphrase; + private final CallbackDispatcher mCallbackDispatcher; + private final int mModelHandle; + + // Model parameter + @GuardedBy("FakeSoundTriggerHal.this.mLock") + private int mThreshold = 0; + + // Mutable + @GuardedBy("FakeSoundTriggerHal.this.mLock") + private boolean mIsUnloaded = false; // Latch + + // Only a single recognition session is able to be active for a model + // session at any given time. Null if no recognition is active. + @GuardedBy("FakeSoundTriggerHal.this.mLock") + @Nullable private RecognitionSession mRecognitionSession; + + private ModelSession(int modelHandle, CallbackDispatcher callbackDispatcher, + boolean isKeyphrase) { + mModelHandle = modelHandle; + mCallbackDispatcher = callbackDispatcher; + mIsKeyphrase = isKeyphrase; + } + + private RecognitionSession startRecognitionForModel() { + synchronized (FakeSoundTriggerHal.this.mLock) { + mRecognitionSession = new RecognitionSession(); + return mRecognitionSession; + } + } + + private RecognitionSession stopRecognitionForModel() { + synchronized (FakeSoundTriggerHal.this.mLock) { + RecognitionSession session = mRecognitionSession; + mRecognitionSession = null; + return session; + } + } + + private void forceRecognitionForModel() { + synchronized (FakeSoundTriggerHal.this.mLock) { + if (mIsKeyphrase) { + PhraseRecognitionEvent phraseEvent = + createDefaultKeyphraseEvent(RecognitionStatus.FORCED); + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.phraseRecognitionCallback(mModelHandle, phraseEvent)); + } else { + RecognitionEvent event = createDefaultEvent(RecognitionStatus.FORCED); + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.recognitionCallback(mModelHandle, event)); + } + } + } + + private void setThresholdFactor(int value) { + synchronized (FakeSoundTriggerHal.this.mLock) { + mThreshold = value; + } + } + + private int getThresholdFactor() { + synchronized (FakeSoundTriggerHal.this.mLock) { + return mThreshold; + } + } + + private boolean getIsUnloaded() { + synchronized (FakeSoundTriggerHal.this.mLock) { + return mIsUnloaded; + } + } + + private RecognitionSession getRecogSession() { + synchronized (FakeSoundTriggerHal.this.mLock) { + return mRecognitionSession; + } + } + + + /** oneway **/ + @Override + public void triggerUnloadModel() { + synchronized (FakeSoundTriggerHal.this.mLock) { + if (mIsDead || mIsUnloaded) return; + if (mRecognitionSession != null) { + // Must abort model before triggering unload + mRecognitionSession.triggerAbortRecognition(); + } + // Invalidate the model session + mIsUnloaded = true; + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.modelUnloaded(mModelHandle)); + // Don't notify the injection that an unload has occurred, since it is what + // triggered the unload + + // Notify if we could have denied a previous model due to contention + if (getNumLoadedModelsLocked() == (mProperties.maxSoundModels - 1) + && !mIsResourceContended) { + mGlobalCallbackDispatcher.wrap((ISoundTriggerHwGlobalCallback cb) -> + cb.onResourcesAvailable()); + } + } + } + + private class RecognitionSession extends IInjectRecognitionEvent.Stub { + + @Override + /** oneway **/ + public void triggerRecognitionEvent(byte[] data, + @Nullable PhraseRecognitionExtra[] phraseExtras) { + synchronized (FakeSoundTriggerHal.this.mLock) { + // Check if our session has already been invalidated + if (mIsDead || mRecognitionSession != this) return; + // Invalidate the recognition session + mRecognitionSession = null; + // Trigger the callback. + if (mIsKeyphrase) { + PhraseRecognitionEvent phraseEvent = + createDefaultKeyphraseEvent(RecognitionStatus.SUCCESS); + phraseEvent.common.data = data; + if (phraseExtras != null) phraseEvent.phraseExtras = phraseExtras; + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.phraseRecognitionCallback(mModelHandle, phraseEvent)); + } else { + RecognitionEvent event = createDefaultEvent(RecognitionStatus.SUCCESS); + event.data = data; + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.recognitionCallback(mModelHandle, event)); + } + } + } + + @Override + /** oneway **/ + public void triggerAbortRecognition() { + synchronized (FakeSoundTriggerHal.this.mLock) { + if (mIsDead || mRecognitionSession != this) return; + // Clear the session state + mRecognitionSession = null; + // Trigger the callback. + if (mIsKeyphrase) { + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.phraseRecognitionCallback(mModelHandle, + createDefaultKeyphraseEvent(RecognitionStatus.ABORTED))); + } else { + mCallbackDispatcher.wrap((ISoundTriggerHwCallback cb) -> + cb.recognitionCallback(mModelHandle, + createDefaultEvent(RecognitionStatus.ABORTED))); + } + } + } + } + } + + // Since this is always constructed, it needs to be cheap to create. + public FakeSoundTriggerHal(ISoundTriggerInjection injection) { + mProperties = createDefaultProperties(); + mInjectionDispatcher = new InjectionDispatcher(injection); + mGlobalCallbackDispatcher = null; // If this NPEs before registration, we want to abort. + // Implement the IInjectGlobalEvent IInterface. + // Since we can't extend multiple IInterface from the same object, instantiate an instance + // for our clients. + mGlobalEventSession = new IInjectGlobalEvent.Stub() { + /** + * Overrides IInjectGlobalEvent method. + * Simulate a HAL process restart. This method is not included in regular HAL interface, + * since the entire process is restarted by sending a signal. + * Since we run in-proc, we must offer an explicit restart method. + * oneway + */ + @Override + public void triggerRestart() throws RemoteException { + synchronized (FakeSoundTriggerHal.this.mLock) { + if (mIsDead) throw new DeadObjectException(); + mIsDead = true; + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onRestarted(this)); + mModelSessionMap.clear(); + if (mDeathRecipient != null) { + final DeathRecipient deathRecipient = mDeathRecipient; + ExecutorHolder.CALLBACK_EXECUTOR.execute(() -> { + try { + deathRecipient.binderDied(FakeSoundTriggerHal.this.asBinder()); + } catch (Throwable e) { + // We don't expect RemoteException at the moment since we run + // in the same process + Slog.wtf(TAG, "Callback dispatch threw", e); + } + }); + } + } + } + + /** + * Overrides IInjectGlobalEvent method. + * oneway + */ + @Override + public void setResourceContention(boolean isResourcesContended, + IAcknowledgeEvent callback) throws RemoteException { + synchronized (FakeSoundTriggerHal.this.mLock) { + if (mIsDead) throw new DeadObjectException(); + mIsResourceContended = isResourcesContended; + // Introducing contention is the only injection which can't be + // observed by the ST client. + mInjectionDispatcher.wrap((ISoundTriggerInjection unused) -> + callback.eventReceived()); + if (!mIsResourceContended) { + mGlobalCallbackDispatcher.wrap((ISoundTriggerHwGlobalCallback cb) -> + cb.onResourcesAvailable()); + } + } + } + }; + // Register the global event injection interface + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) + -> cb.registerGlobalEventInjection(mGlobalEventSession)); + } + + /** + * Get the {@link IInjectGlobalEvent} associated with this instance of the STHAL. + * Used as a session token, valid until restarted. + */ + public IInjectGlobalEvent getGlobalEventInjection() { + return mGlobalEventSession; + } + + // TODO(b/274467228) we can remove the next three methods when this HAL is moved out-of-proc, + // so process restart at death notification is appropriately handled by the binder. + @Override + public void linkToDeath(IBinder.DeathRecipient recipient, int flags) { + synchronized (mLock) { + if (mDeathRecipient != null) { + Slog.wtf(TAG, "Received two death recipients concurrently"); + } + mDeathRecipient = recipient; + } + } + + @Override + public boolean unlinkToDeath(IBinder.DeathRecipient recipient, int flags) { + synchronized (mLock) { + if (mIsDead) return false; + if (mDeathRecipient != recipient) { + throw new NoSuchElementException(); + } + mDeathRecipient = null; + return true; + } + } + + // STHAL method overrides to follow + @Override + public Properties getProperties() throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + Parcel parcel = Parcel.obtain(); + try { + mProperties.writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + return Properties.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + } + } + + @Override + public void registerGlobalCallback( + ISoundTriggerHwGlobalCallback callback) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + mGlobalCallbackDispatcher = new GlobalCallbackDispatcher(callback); + } + } + + @Override + public int loadSoundModel(SoundModel soundModel, + ISoundTriggerHwCallback callback) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + if (mIsResourceContended || getNumLoadedModelsLocked() == mProperties.maxSoundModels) { + throw new ServiceSpecificException(Status.RESOURCE_CONTENTION); + } + int key = mModelKeyCounter++; + ModelSession session = new ModelSession(key, new CallbackDispatcher(callback), false); + + mModelSessionMap.put(key, session); + + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onSoundModelLoaded(soundModel, null, session, mGlobalEventSession)); + return key; + } + } + + @Override + public int loadPhraseSoundModel(PhraseSoundModel soundModel, + ISoundTriggerHwCallback callback) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + if (mIsResourceContended || getNumLoadedModelsLocked() == mProperties.maxSoundModels) { + throw new ServiceSpecificException(Status.RESOURCE_CONTENTION); + } + + int key = mModelKeyCounter++; + ModelSession session = new ModelSession(key, new CallbackDispatcher(callback), true); + + mModelSessionMap.put(key, session); + + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onSoundModelLoaded(soundModel.common, soundModel.phrases, session, + mGlobalEventSession)); + return key; + } + } + + @Override + public void unloadSoundModel(int modelHandle) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to unload model which was never loaded"); + } + + if (session.getRecogSession() != null) { + Slog.wtf(TAG, "Session unloaded before recog stopped!"); + } + + // Session is stale + if (session.getIsUnloaded()) return; + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onSoundModelUnloaded(session)); + + // Notify if we could have denied a previous model due to contention + if (getNumLoadedModelsLocked() == (mProperties.maxSoundModels - 1) + && !mIsResourceContended) { + mGlobalCallbackDispatcher.wrap((ISoundTriggerHwGlobalCallback cb) -> + cb.onResourcesAvailable()); + } + + } + } + + @Override + public void startRecognition(int modelHandle, int deviceHandle, int ioHandle, + RecognitionConfig config) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to start recognition with invalid handle"); + } + + if (session.getIsUnloaded()) { + // TODO(b/274470274) this is a deficiency in the existing HAL API, there is no way + // to handle this race gracefully + throw new ServiceSpecificException(Status.RESOURCE_CONTENTION); + } + ModelSession.RecognitionSession recogSession = session.startRecognitionForModel(); + + // TODO(b/274470571) appropriately translate ioHandle to session handle + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onRecognitionStarted(-1, config, recogSession, session)); + } + } + + @Override + public void stopRecognition(int modelHandle) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to stop recognition with invalid handle"); + } + ModelSession.RecognitionSession recogSession = session.stopRecognitionForModel(); + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onRecognitionStopped(recogSession)); + } + } + + @Override + public void forceRecognitionEvent(int modelHandle) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to force recognition with invalid handle"); + } + + // TODO(b/274470274) this is a deficiency in the existing HAL API, we could always + // get a force request for an already stopped model. The only thing to do is + // drop such a request. + if (session.getRecogSession() == null) return; + session.forceRecognitionForModel(); + } + } + + // TODO(b/274470274) this is a deficiency in the existing HAL API, we could always + // get model param API requests after model unload. + // For now, succeed anyway to maintain fidelity to existing HALs. + @Override + public @Nullable ModelParameterRange queryParameter(int modelHandle, + /** ModelParameter **/ int modelParam) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to get param with invalid handle"); + } + } + if (modelParam == ModelParameter.THRESHOLD_FACTOR) { + ModelParameterRange range = new ModelParameterRange(); + range.minInclusive = THRESHOLD_MIN; + range.maxInclusive = THRESHOLD_MAX; + return range; + } else { + return null; + } + } + + @Override + public int getParameter(int modelHandle, + /** ModelParameter **/ int modelParam) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to get param with invalid handle"); + } + if (modelParam != ModelParameter.THRESHOLD_FACTOR) { + throw new IllegalArgumentException(); + } + return session.getThresholdFactor(); + } + } + + @Override + public void setParameter(int modelHandle, + /** ModelParameter **/ int modelParam, int value) throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + ModelSession session = mModelSessionMap.get(modelHandle); + if (session == null) { + Slog.wtf(TAG, "Attempted to get param with invalid handle"); + } + if ((modelParam == ModelParameter.THRESHOLD_FACTOR) + || (value >= THRESHOLD_MIN && value <= THRESHOLD_MAX)) { + session.setThresholdFactor(value); + } else { + throw new IllegalArgumentException(); + } + mInjectionDispatcher.wrap((ISoundTriggerInjection cb) -> + cb.onParamSet(modelParam, value, session)); + } + } + + @Override + public int getInterfaceVersion() throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + } + return super.VERSION; + } + + @Override + public String getInterfaceHash() throws RemoteException { + synchronized (mLock) { + if (mIsDead) throw new DeadObjectException(); + } + return super.HASH; + } + + // Helpers to follow. + @GuardedBy("mLock") + private int getNumLoadedModelsLocked() { + int numModels = 0; + for (ModelSession session : mModelSessionMap.values()) { + if (!session.getIsUnloaded()) { + numModels++; + } + } + return numModels; + } + + private static Properties createDefaultProperties() { + Properties properties = new Properties(); + properties.implementor = "android"; + properties.description = "AOSP fake STHAL"; + properties.version = 1; + properties.uuid = "00000001-0002-0003-0004-deadbeefabcd"; + properties.supportedModelArch = ISoundTriggerInjection.FAKE_HAL_ARCH; + properties.maxSoundModels = 8; + properties.maxKeyPhrases = 2; + properties.maxUsers = 2; + properties.recognitionModes = RecognitionMode.VOICE_TRIGGER + | RecognitionMode.GENERIC_TRIGGER; + properties.captureTransition = true; + // This is actually not respected, since there is no real AudioRecord + properties.maxBufferMs = 5000; + properties.concurrentCapture = true; + properties.triggerInEvent = false; + properties.powerConsumptionMw = 0; + properties.audioCapabilities = 0; + return properties; + } + + private static RecognitionEvent createDefaultEvent( + /** RecognitionStatus **/ int status) { + RecognitionEvent event = new RecognitionEvent(); + // Overwrite the event appropriately. + event.status = status; + event.type = SoundModelType.GENERIC; + // TODO(b/274466981) make this configurable. + // For now, some plausible defaults + event.captureAvailable = true; + event.captureDelayMs = 50; + event.capturePreambleMs = 200; + event.triggerInData = false; + event.audioConfig = null; // Nullable within AIDL + event.data = new byte[0]; + // We don't support recognition restart for now + event.recognitionStillActive = false; + return event; + } + + private static PhraseRecognitionEvent createDefaultKeyphraseEvent( + /**RecognitionStatus **/ int status) { + RecognitionEvent event = createDefaultEvent(status); + event.type = SoundModelType.KEYPHRASE; + PhraseRecognitionEvent phraseEvent = new PhraseRecognitionEvent(); + phraseEvent.common = event; + phraseEvent.phraseExtras = new PhraseRecognitionExtra[0]; + return phraseEvent; + } + + // Helper classes to dispatch oneway calls to the appropriate callback interfaces to follow. + private static class CallbackDispatcher { + + private CallbackDispatcher(ISoundTriggerHwCallback callback) { + mCallback = callback; + } + + private void wrap(FunctionalUtils.ThrowingConsumer<ISoundTriggerHwCallback> command) { + ExecutorHolder.CALLBACK_EXECUTOR.execute(() -> { + try { + command.accept(mCallback); + } catch (Throwable e) { + Slog.wtf(TAG, "Callback dispatch threw", e); + } + }); + } + + private final ISoundTriggerHwCallback mCallback; + } + + private static class GlobalCallbackDispatcher { + + private GlobalCallbackDispatcher(ISoundTriggerHwGlobalCallback callback) { + mCallback = callback; + } + + private void wrap(FunctionalUtils.ThrowingConsumer<ISoundTriggerHwGlobalCallback> command) { + ExecutorHolder.CALLBACK_EXECUTOR.execute(() -> { + try { + command.accept(mCallback); + } catch (Throwable e) { + // We don't expect RemoteException at the moment since we run + // in the same process + Slog.wtf(TAG, "Callback dispatch threw", e); + } + }); + } + + private final ISoundTriggerHwGlobalCallback mCallback; + } + + private static class InjectionDispatcher { + + private InjectionDispatcher(ISoundTriggerInjection injection) { + mInjection = injection; + } + + private void wrap(FunctionalUtils.ThrowingConsumer<ISoundTriggerInjection> command) { + ExecutorHolder.INJECTION_EXECUTOR.execute(() -> { + try { + command.accept(mInjection); + } catch (Throwable e) { + // We don't expect RemoteException at the moment since we run + // in the same process + Slog.wtf(TAG, "Callback dispatch threw", e); + } + }); + } + + private final ISoundTriggerInjection mInjection; + } +} diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerHal.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerHal.java index aa85dd01405e..75206e69bc6a 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerHal.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerHal.java @@ -141,6 +141,22 @@ interface ISoundTriggerHal { void flushCallbacks(); /** + * Used only for testing purposes. Called when a client attaches to the framework. + * Transmitting this event to the fake STHAL allows observation of this event, which is + * normally consumed by the framework, and is not communicated to the STHAL. + * @param token - A unique binder token associated with this session. + */ + void clientAttached(IBinder token); + + /** + * Used only for testing purposes. Called when a client detached from the framework. + * Transmitting this event to the fake STHAL allows observation of this event, which is + * normally consumed by the framework, and is not communicated to the STHAL. + * @param token - The same token passed to the corresponding {@link clientAttached(IBinder)}. + */ + void clientDetached(IBinder token); + + /** * Kill and restart the HAL instance. This is typically a last resort for error recovery and may * result in other related services being killed. */ diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalConcurrentCaptureHandler.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalConcurrentCaptureHandler.java index b0f03ef48e7e..8c7cabeee320 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalConcurrentCaptureHandler.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalConcurrentCaptureHandler.java @@ -283,6 +283,16 @@ public class SoundTriggerHalConcurrentCaptureHandler implements ISoundTriggerHal mCallbackThread.flush(); } + @Override + public void clientAttached(IBinder binder) { + mDelegate.clientAttached(binder); + } + + @Override + public void clientDetached(IBinder binder) { + mDelegate.clientDetached(binder); + } + /** * This is a thread for asynchronous delivery of callback events, having the following features: * <ul> diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java index 235d10fb5da3..24741e1caea9 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java @@ -211,6 +211,16 @@ public class SoundTriggerHalEnforcer implements ISoundTriggerHal { mUnderlying.flushCallbacks(); } + @Override + public void clientAttached(IBinder binder) { + mUnderlying.clientAttached(binder); + } + + @Override + public void clientDetached(IBinder binder) { + mUnderlying.clientDetached(binder); + } + private RuntimeException handleException(RuntimeException e) { if (e instanceof RecoverableException) { throw e; diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalMaxModelLimiter.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalMaxModelLimiter.java index 7dd28e0b88f9..8cdd2697db50 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalMaxModelLimiter.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalMaxModelLimiter.java @@ -165,4 +165,14 @@ public class SoundTriggerHalMaxModelLimiter implements ISoundTriggerHal { public void flushCallbacks() { mDelegate.flushCallbacks(); } + + @Override + public void clientAttached(IBinder binder) { + mDelegate.clientAttached(binder); + } + + @Override + public void clientDetached(IBinder binder) { + mDelegate.clientDetached(binder); + } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java index b817821b48dc..0390f034ab23 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java @@ -143,6 +143,16 @@ public class SoundTriggerHalWatchdog implements ISoundTriggerHal { } @Override + public void clientAttached(IBinder binder) { + mUnderlying.clientAttached(binder); + } + + @Override + public void clientDetached(IBinder binder) { + mUnderlying.clientDetached(binder); + } + + @Override public void reboot() { mUnderlying.reboot(); } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java index 9bbae4bd2db5..c67bdd76eee8 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java @@ -414,6 +414,16 @@ final class SoundTriggerHw2Compat implements ISoundTriggerHal { // This is a no-op. Only implemented for decorators. } + @Override + public void clientAttached(IBinder binder) { + // This is a no-op. Only implemented for decorators. + } + + @Override + public void clientDetached(IBinder binder) { + // This is a no-op. Only implemented for decorators. + } + private Properties getProperties_2_0() throws RemoteException { AtomicInteger retval = new AtomicInteger(-1); diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw3Compat.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw3Compat.java index ebe0ff85167d..8bb5eb191858 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw3Compat.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw3Compat.java @@ -186,6 +186,16 @@ public class SoundTriggerHw3Compat implements ISoundTriggerHal { } @Override + public void clientAttached(IBinder binder) { + // No-op. This method is for test purposes, and is intercepted above. + } + + @Override + public void clientDetached(IBinder binder) { + // No-op. This method is for test purposes, and is intercepted above. + } + + @Override public void reboot() { mRebootRunnable.run(); } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerInjection.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerInjection.java new file mode 100644 index 000000000000..30e079475b7c --- /dev/null +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerInjection.java @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.soundtrigger_middleware; + +import android.annotation.Nullable; +import android.media.soundtrigger.Phrase; +import android.media.soundtrigger.RecognitionConfig; +import android.media.soundtrigger.SoundModel; +import android.media.soundtrigger_middleware.IInjectGlobalEvent; +import android.media.soundtrigger_middleware.IInjectModelEvent; +import android.media.soundtrigger_middleware.IInjectRecognitionEvent; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; + +import java.util.Objects; + +/** + * Service side of the injection interface which enforces a single client. + * Essentially a facade that presents an ever-present, single injection client to the fake STHAL. + * Proxies a binder interface, but should never be called as such. + * @hide + */ + +public class SoundTriggerInjection implements ISoundTriggerInjection, IBinder.DeathRecipient { + + private static final String TAG = "SoundTriggerInjection"; + + private final Object mClientLock = new Object(); + @GuardedBy("mClientLock") + private ISoundTriggerInjection mClient = null; + @GuardedBy("mClientLock") + private IInjectGlobalEvent mGlobalEventInjection = null; + + /** + * Register a remote injection client. + * @param client - The injection client to register + */ + public void registerClient(ISoundTriggerInjection client) { + synchronized (mClientLock) { + Objects.requireNonNull(client); + if (mClient != null) { + try { + mClient.onPreempted(); + } catch (RemoteException e) { + Slog.e(TAG, "RemoteException when handling preemption", e); + } + mClient.asBinder().unlinkToDeath(this, 0); + } + mClient = client; + // Register cached global event injection interfaces, + // in case our client missed them. + try { + mClient.asBinder().linkToDeath(this, 0); + if (mGlobalEventInjection != null) { + mClient.registerGlobalEventInjection(mGlobalEventInjection); + } + } catch (RemoteException e) { + mClient = null; + } + + } + } + + @Override + public void binderDied() { + Slog.wtf(TAG, "Binder died without params"); + } + + // If the binder has died, clear out mClient. + @Override + public void binderDied(IBinder who) { + synchronized (mClientLock) { + if (mClient != null && who == mClient.asBinder()) { + mClient = null; + } + } + } + + @Override + public void registerGlobalEventInjection(IInjectGlobalEvent globalInjection) { + synchronized (mClientLock) { + // Cache for late attaching clients + mGlobalEventInjection = globalInjection; + if (mClient == null) return; + try { + mClient.registerGlobalEventInjection(mGlobalEventInjection); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onRestarted(IInjectGlobalEvent globalSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onRestarted(globalSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onFrameworkDetached(IInjectGlobalEvent globalSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onFrameworkDetached(globalSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onClientAttached(IBinder token, IInjectGlobalEvent globalSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onClientAttached(token, globalSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onClientDetached(IBinder token) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onClientDetached(token); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onSoundModelLoaded(SoundModel model, @Nullable Phrase[] phrases, + IInjectModelEvent modelInjection, IInjectGlobalEvent globalSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onSoundModelLoaded(model, phrases, modelInjection, globalSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onParamSet(/** ModelParameter **/ int modelParam, int value, + IInjectModelEvent modelSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onParamSet(modelParam, value, modelSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onRecognitionStarted(int audioSessionToken, RecognitionConfig config, + IInjectRecognitionEvent recognitionInjection, IInjectModelEvent modelSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onRecognitionStarted(audioSessionToken, config, + recognitionInjection, modelSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onRecognitionStopped(IInjectRecognitionEvent recognitionSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onRecognitionStopped(recognitionSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onSoundModelUnloaded(IInjectModelEvent modelSession) { + synchronized (mClientLock) { + if (mClient == null) return; + try { + mClient.onSoundModelUnloaded(modelSession); + } catch (RemoteException e) { + mClient = null; + } + } + } + + @Override + public void onPreempted() { + // We are the service, so we can't be preempted. + Slog.wtf(TAG, "Unexpected preempted!"); + } + + @Override + public IBinder asBinder() { + // This class is not a real binder object + Slog.wtf(TAG, "Unexpected asBinder!"); + throw new UnsupportedOperationException("Calling asBinder on a fake binder object"); + } + +} diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java index 807ed14e85ce..91e546696971 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.SOUNDTRIGGER_DELEGATE_IDENTITY; import android.annotation.NonNull; import android.content.Context; +import android.content.PermissionChecker; import android.media.permission.ClearCallingIdentityContext; import android.media.permission.Identity; import android.media.permission.PermissionUtil; @@ -29,6 +30,7 @@ import android.media.soundtrigger.PhraseSoundModel; import android.media.soundtrigger.RecognitionConfig; import android.media.soundtrigger.SoundModel; import android.media.soundtrigger_middleware.ISoundTriggerCallback; +import android.media.soundtrigger_middleware.ISoundTriggerInjection; import android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService; import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; @@ -68,15 +70,18 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic private final @NonNull ISoundTriggerMiddlewareInternal mDelegate; private final @NonNull Context mContext; + // Lightweight object used to delegate injection events to the fake STHAL + private final @NonNull SoundTriggerInjection mInjection; /** * Constructor for internal use only. Could be exposed for testing purposes in the future. * Users should access this class via {@link Lifecycle}. */ private SoundTriggerMiddlewareService(@NonNull ISoundTriggerMiddlewareInternal delegate, - @NonNull Context context) { + @NonNull Context context, @NonNull SoundTriggerInjection injection) { mDelegate = Objects.requireNonNull(delegate); mContext = context; + mInjection = injection; } @Override @@ -114,6 +119,16 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic } @Override + @android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) + public void attachFakeHalInjection(@NonNull ISoundTriggerInjection injection) { + PermissionChecker.checkCallingOrSelfPermissionForPreflight( + mContext, android.Manifest.permission.MANAGE_SOUND_TRIGGER); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + mInjection.registerClient(Objects.requireNonNull(injection)); + } + } + + @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { if (mDelegate instanceof Dumpable) { ((Dumpable) mDelegate).dump(fout); @@ -223,7 +238,9 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic @Override public void onStart() { - HalFactory[] factories = new HalFactory[]{new DefaultHalFactory()}; + final SoundTriggerInjection injection = new SoundTriggerInjection(); + HalFactory[] factories = new HalFactory[]{new DefaultHalFactory(), + new FakeHalFactory(injection)}; publishBinderService(Context.SOUND_TRIGGER_MIDDLEWARE_SERVICE, new SoundTriggerMiddlewareService( @@ -232,7 +249,8 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic new SoundTriggerMiddlewareValidation( new SoundTriggerMiddlewareImpl(factories, new AudioSessionProviderImpl())), - getContext())), getContext())); + getContext())), getContext(), + injection)); } } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java index fd8dee8416f6..d2d8f1ad7a71 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -29,6 +29,7 @@ import android.media.soundtrigger.SoundModelType; import android.media.soundtrigger.Status; import android.media.soundtrigger_middleware.ISoundTriggerCallback; import android.media.soundtrigger_middleware.ISoundTriggerModule; +import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; @@ -38,6 +39,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -92,13 +94,14 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo /** * Ctor. * - * @param halFactory A factory for the underlying HAL driver. + * @param halFactory - A factory for the underlying HAL driver. + * @param audioSessionProvider - Creates a session token + device id/port pair used to + * associate recognition events with the audio stream used to access data. */ SoundTriggerModule(@NonNull HalFactory halFactory, @NonNull SoundTriggerMiddlewareImpl.AudioSessionProvider audioSessionProvider) { - assert halFactory != null; - mHalFactory = halFactory; - mAudioSessionProvider = audioSessionProvider; + mHalFactory = Objects.requireNonNull(halFactory); + mAudioSessionProvider = Objects.requireNonNull(audioSessionProvider); attachToHal(); } @@ -218,6 +221,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo */ private class Session implements ISoundTriggerModule { private ISoundTriggerCallback mCallback; + private final IBinder mToken = new Binder(); private final Map<Integer, Model> mLoadedModels = new HashMap<>(); /** @@ -227,6 +231,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo */ private Session(@NonNull ISoundTriggerCallback callback) { mCallback = callback; + mHalService.clientAttached(mToken); } @Override @@ -237,6 +242,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo } removeSession(this); mCallback = null; + mHalService.clientDetached(mToken); } } diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java index 86623599d984..905a90c11957 100644 --- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java @@ -842,6 +842,34 @@ public final class TelephonyPermissions { /** * Check if calling user is associated with the given subscription. + * Subscription-user association check is skipped if destination address is an emergency number. + * + * @param context Context + * @param subId subscription ID + * @param callerUserHandle caller user handle + * @param destAddr destination address of the message + * @return true if destAddr is an emergency number + * and return false if user is not associated with the subscription. + */ + public static boolean checkSubscriptionAssociatedWithUser(@NonNull Context context, int subId, + @NonNull UserHandle callerUserHandle, @NonNull String destAddr) { + // Skip subscription-user association check for emergency numbers + TelephonyManager tm = context.getSystemService(TelephonyManager.class); + final long token = Binder.clearCallingIdentity(); + try { + if (tm != null && tm.isEmergencyNumber(destAddr)) { + Log.d(LOG_TAG, "checkSubscriptionAssociatedWithUser:" + + " destAddr is emergency number"); + return true; + } + } finally { + Binder.restoreCallingIdentity(token); + } + return checkSubscriptionAssociatedWithUser(context, subId, callerUserHandle); + } + + /** + * Check if calling user is associated with the given subscription. * @param context Context * @param subId subscription ID * @param callerUserHandle caller user handle diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java index ba3a192074bc..5eace5433128 100644 --- a/telephony/java/android/telephony/CellIdentityCdma.java +++ b/telephony/java/android/telephony/CellIdentityCdma.java @@ -23,6 +23,9 @@ import android.annotation.Nullable; import android.os.Parcel; import android.telephony.cdma.CdmaCellLocation; +import com.android.internal.telephony.util.TelephonyUtils; +import com.android.telephony.Rlog; + import java.util.Objects; /** @@ -242,8 +245,8 @@ public final class CellIdentityCdma extends CellIdentity { .append(":{ mNetworkId=").append(mNetworkId) .append(" mSystemId=").append(mSystemId) .append(" mBasestationId=").append(mBasestationId) - .append(" mLongitude=").append(mLongitude) - .append(" mLatitude=").append(mLatitude) + .append(" mLongitude=").append(Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, mLongitude)) + .append(" mLatitude=").append(Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, mLatitude)) .append(" mAlphaLong=").append(mAlphaLong) .append(" mAlphaShort=").append(mAlphaShort) .append("}").toString(); diff --git a/telephony/java/android/telephony/cdma/CdmaCellLocation.java b/telephony/java/android/telephony/cdma/CdmaCellLocation.java index d808cabaaa92..d4cb5ac8a64c 100644 --- a/telephony/java/android/telephony/cdma/CdmaCellLocation.java +++ b/telephony/java/android/telephony/cdma/CdmaCellLocation.java @@ -21,6 +21,9 @@ import android.os.Build; import android.os.Bundle; import android.telephony.CellLocation; +import com.android.internal.telephony.util.TelephonyUtils; +import com.android.telephony.Rlog; + /** * Represents the cell location on a CDMA phone. * @@ -197,8 +200,8 @@ public class CdmaCellLocation extends CellLocation { @Override public String toString() { return "[" + this.mBaseStationId + "," - + this.mBaseStationLatitude + "," - + this.mBaseStationLongitude + "," + + Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, this.mBaseStationLatitude) + "," + + Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, this.mBaseStationLongitude) + "," + this.mSystemId + "," + this.mNetworkId + "]"; } diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index 33c86d8299a0..4c37f7d3184c 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -398,7 +398,11 @@ public class ImsService extends Service { ImsService.this.disableImsForSubscription(slotId, subId), "disableIms"); } - + @Override + public void resetIms(int slotId, int subId) { + executeMethodAsync(() -> + ImsService.this.resetImsInternal(slotId, subId), "resetIms"); + } }; private final IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @@ -634,6 +638,14 @@ public class ImsService extends Service { } } + private void resetImsInternal(int slotId, int subId) { + try { + resetIms(slotId); + } catch (UnsupportedOperationException e) { + disableImsForSubscription(slotId, subId); + } + } + /** * When called, provide the {@link ImsFeatureConfiguration} that this {@link ImsService} * currently supports. This will trigger the framework to set up the {@link ImsFeature}s that @@ -751,6 +763,19 @@ public class ImsService extends Service { } /** + * The framework has reset IMS for the slot specified. The ImsService must deregister + * and release all resources for IMS. After resetIms is called, either + * {@link #enableImsForSubscription(int, int)} or {@link #disableImsForSubscription(int, int)} + * will be called for the same slotId. + * + * @param slotId The slot ID that IMS will be reset for. + * @hide + */ + public void resetIms(int slotId) { + throw new UnsupportedOperationException(); + } + + /** * When called, the framework is requesting that a new {@link MmTelFeature} is created for the * specified subscription. * diff --git a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl index ae6166fea02a..fdf43a52685a 100644 --- a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl +++ b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl @@ -47,4 +47,5 @@ interface IImsServiceController { ISipTransport getSipTransport(int slotId); oneway void enableIms(int slotId, int subId); oneway void disableIms(int slotId, int subId); + oneway void resetIms(int slotId, int subId); } diff --git a/test-mock/src/android/test/mock/MockContentProvider.java b/test-mock/src/android/test/mock/MockContentProvider.java index 7f084f896e3f..548dded9c47e 100644 --- a/test-mock/src/android/test/mock/MockContentProvider.java +++ b/test-mock/src/android/test/mock/MockContentProvider.java @@ -140,7 +140,8 @@ public class MockContentProvider extends ContentProvider { } @Override - public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException { + public String[] getStreamTypes(AttributionSource attributionSource, + Uri url, String mimeTypeFilter) throws RemoteException { return MockContentProvider.this.getStreamTypes(url, mimeTypeFilter); } diff --git a/test-mock/src/android/test/mock/MockIContentProvider.java b/test-mock/src/android/test/mock/MockIContentProvider.java index bb2996a2cb40..23f8b98a704a 100644 --- a/test-mock/src/android/test/mock/MockIContentProvider.java +++ b/test-mock/src/android/test/mock/MockIContentProvider.java @@ -144,7 +144,8 @@ public class MockIContentProvider implements IContentProvider { } @Override - public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException { + public String[] getStreamTypes(@NonNull AttributionSource attributionSource, + Uri url, String mimeTypeFilter) throws RemoteException { throw new UnsupportedOperationException("unimplemented mock method"); } diff --git a/tests/ActivityManagerPerfTests/stub-app/AndroidManifest.xml b/tests/ActivityManagerPerfTests/stub-app/AndroidManifest.xml index 6bdeea06053f..02d03bbfdb1e 100644 --- a/tests/ActivityManagerPerfTests/stub-app/AndroidManifest.xml +++ b/tests/ActivityManagerPerfTests/stub-app/AndroidManifest.xml @@ -19,6 +19,12 @@ package="com.android.stubs.am"> <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/> + <queries> + <intent> + <action android:name="com.android.stubs.am.ACTION_BROADCAST_TEST"/> + </intent> + </queries> + <application android:label="Android TestCase"> <provider android:authorities="@string/authority" android:name=".TestContentProvider" diff --git a/tests/ApkVerityTest/AndroidTest.xml b/tests/ApkVerityTest/AndroidTest.xml index 2a0a2c76e50f..4487cefb4f9c 100644 --- a/tests/ApkVerityTest/AndroidTest.xml +++ b/tests/ApkVerityTest/AndroidTest.xml @@ -16,6 +16,11 @@ <configuration description="APK fs-verity integration/regression test"> <option name="test-suite-tag" value="apct" /> + <object type="module_controller" class="com.android.tradefed.testtype.suite.module.ShippingApiLevelModuleController"> + <!-- fs-verity is required since R/30 --> + <option name="vsr-min-api-level" value="30" /> + </object> + <!-- This test requires root to write against block device. --> <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" /> diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java index 30bb98962b3c..af3afa88f5e0 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java @@ -20,8 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -49,14 +47,9 @@ public final class SharedConnectivitySettingsState implements Parcelable { */ public static final class Builder { private boolean mInstantTetherEnabled; - private Intent mInstantTetherSettingsIntent; - private final Context mContext; + private PendingIntent mInstantTetherSettingsPendingIntent; private Bundle mExtras = Bundle.EMPTY; - public Builder(@NonNull Context context) { - mContext = context; - } - /** * Sets the state of Instant Tether in settings * @@ -69,16 +62,14 @@ public final class SharedConnectivitySettingsState implements Parcelable { } /** - * Sets the intent that will open the Instant Tether settings page. - * The intent will be stored as a {@link PendingIntent} in the settings object. The pending - * intent will be set as {@link PendingIntent#FLAG_IMMUTABLE} and - * {@link PendingIntent#FLAG_ONE_SHOT}. + * Sets the {@link PendingIntent} that will open the Instant Tether settings page. + * The pending intent must be set as {@link PendingIntent#FLAG_IMMUTABLE}. * * @return Returns the Builder object. */ @NonNull - public Builder setInstantTetherSettingsPendingIntent(@NonNull Intent intent) { - mInstantTetherSettingsIntent = intent; + public Builder setInstantTetherSettingsPendingIntent(@NonNull PendingIntent pendingIntent) { + mInstantTetherSettingsPendingIntent = pendingIntent; return this; } @@ -100,19 +91,21 @@ public final class SharedConnectivitySettingsState implements Parcelable { */ @NonNull public SharedConnectivitySettingsState build() { - if (mInstantTetherSettingsIntent != null) { - PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, - mInstantTetherSettingsIntent, - PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT); - return new SharedConnectivitySettingsState(mInstantTetherEnabled, - pendingIntent, mExtras); - } - return new SharedConnectivitySettingsState(mInstantTetherEnabled, null, mExtras); + return new SharedConnectivitySettingsState(mInstantTetherEnabled, + mInstantTetherSettingsPendingIntent, mExtras); + + } + } + + private static void validate(PendingIntent pendingIntent) { + if (pendingIntent != null && !pendingIntent.isImmutable()) { + throw new IllegalArgumentException("Pending intent must be immutable"); } } private SharedConnectivitySettingsState(boolean instantTetherEnabled, PendingIntent pendingIntent, @NonNull Bundle extras) { + validate(pendingIntent); mInstantTetherEnabled = instantTetherEnabled; mInstantTetherSettingsPendingIntent = pendingIntent; mExtras = extras; diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java index 06a86ccb00ee..2bbe91958383 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java @@ -206,7 +206,7 @@ public abstract class SharedConnectivityService extends Service { // Done lazily since creating it needs a context. if (mSettingsState == null) { mSettingsState = new SharedConnectivitySettingsState - .Builder(getApplicationContext()) + .Builder() .setInstantTetherEnabled(false) .setExtras(Bundle.EMPTY).build(); } diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java index 71239087b2bd..96afe278e3e0 100644 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java +++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java @@ -498,7 +498,7 @@ public class SharedConnectivityManagerTest { public void getSettingsState_serviceConnected_shouldReturnState() throws RemoteException { SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); SharedConnectivitySettingsState state = - new SharedConnectivitySettingsState.Builder(mContext).setInstantTetherEnabled(true) + new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(true) .setExtras(new Bundle()).build(); manager.setService(mService); when(mService.getSettingsState()).thenReturn(state); diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java index 5e17dfba9790..d6e7138dee2c 100644 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java +++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java @@ -18,6 +18,10 @@ package android.net.wifi.sharedconnectivity.app; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Intent; import android.os.Parcel; @@ -37,13 +41,24 @@ public class SharedConnectivitySettingsStateTest { private static final boolean INSTANT_TETHER_STATE_1 = false; private static final String INTENT_ACTION_1 = "instant.tether.settings1"; + @Test + public void pendingIntentMutable_buildShouldThrow() { + SharedConnectivitySettingsState.Builder builder = + new SharedConnectivitySettingsState.Builder() + .setInstantTetherEnabled(INSTANT_TETHER_STATE) + .setInstantTetherSettingsPendingIntent(PendingIntent.getActivity( + ApplicationProvider.getApplicationContext(), 0, + new Intent(INTENT_ACTION).setComponent(new ComponentName( + "com.test.package", "TestClass")), + PendingIntent.FLAG_MUTABLE)); + + Exception e = assertThrows(IllegalArgumentException.class, builder::build); + assertThat(e.getMessage()).contains("Pending intent must be immutable"); + } - /** - * Verifies parcel serialization/deserialization. - */ @Test - public void testParcelOperation() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder().build(); + public void parcelOperation() { + SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); Parcel parcel = Parcel.obtain(); state.writeToParcel(parcel, 0); @@ -55,45 +70,46 @@ public class SharedConnectivitySettingsStateTest { assertThat(fromParcel.hashCode()).isEqualTo(state.hashCode()); } - /** - * Verifies the Equals operation - */ @Test - public void testEqualsOperation() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder().build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder().build(); + public void equalsOperation() { + SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); + SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); assertThat(state1).isEqualTo(state2); - SharedConnectivitySettingsState.Builder builder = buildSettingsStateBuilder() + SharedConnectivitySettingsState.Builder builder = buildSettingsStateBuilder(INTENT_ACTION) .setInstantTetherEnabled(INSTANT_TETHER_STATE_1); assertThat(builder.build()).isNotEqualTo(state1); - builder = buildSettingsStateBuilder() - .setInstantTetherSettingsPendingIntent(new Intent(INTENT_ACTION_1)); + builder = buildSettingsStateBuilder(INTENT_ACTION_1); assertThat(builder.build()).isNotEqualTo(state1); } - /** - * Verifies the get methods return the expected data. - */ @Test - public void testGetMethods() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder().build(); + public void getMethods() { + SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); + assertThat(state.isInstantTetherEnabled()).isEqualTo(INSTANT_TETHER_STATE); + assertThat(state.getInstantTetherSettingsPendingIntent()) + .isEqualTo(buildPendingIntent(INTENT_ACTION)); } @Test - public void testHashCode() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder().build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder().build(); + public void hashCodeCalculation() { + SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); + SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); assertThat(state1.hashCode()).isEqualTo(state2.hashCode()); } - private SharedConnectivitySettingsState.Builder buildSettingsStateBuilder() { - return new SharedConnectivitySettingsState.Builder( - ApplicationProvider.getApplicationContext()) + private SharedConnectivitySettingsState.Builder buildSettingsStateBuilder(String intentAction) { + return new SharedConnectivitySettingsState.Builder() .setInstantTetherEnabled(INSTANT_TETHER_STATE) - .setInstantTetherSettingsPendingIntent(new Intent(INTENT_ACTION)); + .setInstantTetherSettingsPendingIntent(buildPendingIntent(intentAction)); + } + + private PendingIntent buildPendingIntent(String intentAction) { + return PendingIntent.getActivity( + ApplicationProvider.getApplicationContext(), 0, + new Intent(intentAction), PendingIntent.FLAG_IMMUTABLE); } } diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityServiceTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityServiceTest.java index 4a293cb5c8db..c6f67987746a 100644 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityServiceTest.java +++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityServiceTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -400,8 +401,10 @@ public class SharedConnectivityServiceTest { } private SharedConnectivitySettingsState buildSettingsState() { - return new SharedConnectivitySettingsState.Builder(mContext).setInstantTetherEnabled(true) - .setInstantTetherSettingsPendingIntent(new Intent()) + return new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(true) + .setInstantTetherSettingsPendingIntent( + PendingIntent.getActivity(mContext, 0, new Intent(), + PendingIntent.FLAG_IMMUTABLE)) .setExtras(Bundle.EMPTY).build(); } } |